如何在 C 中将 10131520 转换为 Unix 纪元时间?
Posted
技术标签:
【中文标题】如何在 C 中将 10131520 转换为 Unix 纪元时间?【英文标题】:How Can I Convert 10131520 Into Unix Epoch Time In C? 【发布时间】:2016-01-20 01:43:38 【问题描述】:我有一个字符串 10131520,我正在尝试将其转换为 C 中的 Unix 纪元时间。如果数字像 10-13-1520 这样分开,我可以使用类似 strptime() 的东西,但我遇到了麻烦,因为没有分隔符。我正在考虑可能通过读取前 2 位并将它们存储到一个月变量中来拆分这些位,然后将接下来的 2 位存储到一天中,然后将最后 4 位存储到时间中。
如果有人能指出我正确的方向,我将不胜感激。
谢谢
【问题讨论】:
它的字节,而不是位。只需使用其中一个字符串函数来提取您需要的值并将其转换为 strptime 所需的形式。 你试过“%m%d%Y”作为一种格式吗?我认为 strptime() 不需要分隔符。但它不适用于 1520 年。字符串真的是 MMDDYYYY 格式还是示例选择不当? 【参考方案1】:这行得通,有不同的方法,这是一种简单易懂的方法。
#include <stdio.h>
#include <string.h>
// to change 10131520 into 10-13-1520
main( )
char string[] = "10131520";
char stringout[11];
char year_str[5];
char month_str[3];
char day_str[3];
month_str[0] = string[0];
month_str[1] = string[1];
month_str[2] = '\0';
day_str[0] = string[2];
day_str[1] = string[3];
day_str[2] = '\0';
year_str[0] = string[4];
year_str[1] = string[5];
year_str[2] = string[6];
year_str[3] = string[7];
year_str[4] = '\0';
strcpy( stringout, month_str );
strcat( stringout, "-" );
strcat( stringout, day_str );
strcat( stringout, "-" );
strcat( stringout, year_str );
printf( "\n the date is %s", stringout );
getchar( );
【讨论】:
【参考方案2】:首先,从字符串中获取年、月和日:
char my_date="10131520";
int my_date_n=atoi(my_date); // or any better method
int month = (my_date_n/1000000)%100;
int day = (my_date_n/ 10000)%100;
int year = (my_date_n/ 1)%10000;
(有很多方法可以做到这一点。这可能不是最好的。)
然后,通常对于遥远的日期,您会使用儒略日: https://en.wikipedia.org/wiki/Julian_day#Converting_Julian_or_Gregorian_calendar_date_to_Julian_Day_Number
例如:
double calc_jd(int y, int mo, int d,
int h, int mi, float s)
// variant using ints
int A=(14-mo)/12;
int Y=y+4800-A;
int M=mo+12*A-3;
int JD=d + ((153*M+2)/5) + 365*Y + (Y/4) - (Y/100) + (Y/400) - 32045;
// add time of day at this stage
return JD + (h-12)/24.0 + mi/1440.0 + s*(1.0/86400.0);
然后你将这个转换为unix时间,这与这个问题的答案相反:
Convert unix timestamp to julian
double unix_time_from_jd(double jd)
return (jd-2440587.5)*86400.0;
所以
double jd = calc_jd(year,month,day,12,0,0); // time of day, timezone?
double unix_time = unix_time_from_jd(jd);
请注意,您可能会超出可以使用的任何范围 如果我们谈论的是使用这种日期的普通工具 1520 年。(这就是我在这里一直使用双精度的原因。)
【讨论】:
以上是关于如何在 C 中将 10131520 转换为 Unix 纪元时间?的主要内容,如果未能解决你的问题,请参考以下文章
如何在目标 c 中将 NSString 转换为 NSDictionary?
如何在 C 中将 short 转换为 unsigned char *buf?