从UNIX时间戳获取同月第一天的时间戳,无需任何转换即可到达本地时间

时间:2014-12-17 16:54:12

标签: c++ time

假设我有这样的UNIX时间戳

1252301772

我需要将它转换为代表同月第一天的另一个时间戳(没有任何转换到当地时间或类似的东西)。例如:

1252301772 -> 07 Sep 2009 05:36:12 GMT
x -> 01 Sep 2009 00:00:00 GMT

1 个答案:

答案 0 :(得分:1)

#include <time.h>

time_t first_of_the_month(time_t t)
{
  struct tm tmt;
  if (!gmtime_r(&t, &tmt))
    return -1;
  tmt.tm_sec = 0;
  tmt.tm_min = 0;
  tmt.tm_hour = 0;
  tmt.tm_mday = 1;
  tmt.tm_isdst = -1;
  return timegm(&tmt);
}

这使用非标准timegm功能(感谢Jeremy Friesner指出这一点)。如果您的平台上没有该功能,您可以使用mktime,但这取决于当地时区,因此您需要调整程序的时区(通过在环境中设置TZ并调用tzset)在调用mktime之前和之后,这不是线程安全的,因为它改变了全局程序状态。