如何在C中将10131520转换为Unix纪元时间?

时间:2015-10-21 07:00:51

标签: c linux unix posix epoch

我有一个字符串10131520,我试图在C中转换为Unix Epoch时间。如果数字像10-13-1520那样分开,我可以使用像strptime()这样的东西,但我遇到了麻烦,因为那里不是分手。我正在考虑通过读取前2位并将它们存储到月份变量中来分割位,然后将下两位存储到白天,然后将最后4位存储到时间中。

如果有人能指出我正确的方向,我会非常感激。

谢谢

2 个答案:

答案 0 :(得分:0)

这个作品,有不同的方式,这是一种简单易懂的方式。

#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(  );
}

答案 1 :(得分:0)

首先,从字符串中获取年,月,日:

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年。(这就是我在这里继续使用双倍的原因。)