使用C将时间戳转换为格式化的日期时间

您所在的位置:网站首页 c语言时区转换 使用C将时间戳转换为格式化的日期时间

使用C将时间戳转换为格式化的日期时间

2022-11-29 03:41| 来源: 网络整理| 查看: 265

我只能使用C标准库(C 14)将时间戳转换为给定的格式date-time。我是C语言的新手,我知道C通过Java之类的库对我们的支持并不多。 在中欧时区(CET)的给定日期和时间2011-03-10 11:23:56,以下 将产生标准格式的输出:" 2011-03-10T11:23:56.123 0100"。

123std::string format ="yyyy-MM-dd'T'HH:mm:ss'.'SSSZ"; //default format auto duration = std::chrono::system_clock::now().time_since_epoch(); auto timestamp = std::chrono::duration_cast(duration).count();

我的格式字符串语法为

12345678910111213141516G : Era yy,yyyy : year (two digits/four digits) M,MM : month in number (without zero/ with zero) - (e.g.,1/01) MMM,MMMM : month in text (shortname/fullname)- (e.g.,jan/january) d,dd : day in month (without zero/with zero)- (e.g.,1/01) D : day in year F : day of week of month E, EEEE : day of week h,hh : hours(1-12) (without zero/with zero)- (e.g.,1/01) H,HH : hours(0-23) (without zero/with zero)- (e.g.,1/01) m,mm : minutes (without zero/with zero)- (e.g.,1/01) s,ss : seconds (without zero/with zero)- (e.g.,1/01) S,SS,SSS : milliseconds w,W : Week in year (without zero/with zero)- (e.g.,1/01) a : AM/PM z,zzzz : timezone name 相关讨论 你尝试了什么?什么没用?堆栈溢出不是一项家庭作业编写服务。如果不是家庭作业,请使用c 20日期库en.cppreference.com/w/cpp/chrono,该库也可在howardhinnant.github.io/date/date.html上获得。 也许std :: put_time在这里有用吗? @AlanBirtles"仅C标准库(C 14)"使您认为他可以使用尚未完全实现的C标准吗? 看起来您想以ISO 8601格式输出时间戳。如果为真,那么这里应该有一些解决方案:stackoverflow.com/questions/9527960/… @eike我确实读过这个问题,我试图说服他,除非他正在做家庭作业,否则他应该改变立场,让别人通过使用图书馆为他做这项工作。 @AlanBirtles当然不是家庭作业。因为我的公司不允许使用C 20,所以我必须使用C 14。 但是,没有理由不使用具有自由许可证的库,请尝试说服您的公司,如果您使用可用的库而不是必须自己实现所有功能,那么您的生产率将更高,代码也将更加可靠。 感谢您的评论,因此,如果我使用C 20,您有任何建议函数或lib供我使用吗? 使用我上面链接到的日期库(不需要c 20,只需要c 11),问题中的示例由@Frodyne链接 如何在C中构造ISO 8601日期时间的可能重复项? ISO 8601是我的默认格式,但是我想将时间戳转换为用户输入的格式。在Java中,我经常使用SimpleDateFormat,它将接收输入格式,然后将时间戳转换为该格式。那就是我试图在C中寻找的东西。 当前日期和时间为字符串

这是一个棘手的问题,因为:

没有明确说明输入的内容。但是从示例代码中,我将假设std::chrono::system_clock::time_point。

重要的是要认识到,中欧时区(CET)被定义为UTC偏移固定为1h的时区。有些地理区域全年都遵循此时区规则,有些则没有。而且没有人一直跟随它。无论如何,问题的这一部分使我们能够对所涉及的UTC偏移进行硬编码:1h。没有夏令时调整。

在C 14中,有两种方法可以在不涉及受版权保护(甚至是开源)的第三方软件的情况下进行操作:

使用C API。

自己滚动。

1的问题是它容易出错。它不能直接处理毫秒精度。它不直接处理特定的时区,例如CET。 C API仅知道UTC和计算机的本地设置时区。但是这些问题是可以克服的。

2的问题在于它涉及非直观的算法,用于从std::chrono::system_clock::time_point中提取年,月和日字段。

尽管存在2的问题,但这是我更喜欢的解决方案,以及我将在下面介绍的内容。我还将展示C 20如何使这一过程变得更加容易。

在所有解决方案中,我将通过实现以下形式的函数来形式化输入和输出:

1std::string format_CET(std::chrono::system_clock::time_point tp);

自己动手(C 14)

有六个不连续的步骤。它将需要这些标头,而无需其他标头:

123456#include #include #include #include #include #include

A。将输入移位1小时UTC偏移量。

12// shift time_point to CET tp += 1h;

使用函数局部使用的指令很方便将UDL h纳入范围,以及此函数中所需的其他所有内容:

1using namespace std::chrono;

B。获取time_point tp的两种变体:一种具有毫秒精度,另一种具有日精度:

123// Get time_points with both millisecond and day precision auto tp_ms = time_point_cast(tp); auto tp_d = time_point_cast(tp_ms);

重要的是要了解这两个强制转换将趋近于零,并且对于负的时间点将给出错误的结果。 system_clock在其1970-01-01 00:00:00 UTC时期之前给出负的时间点。 C 17引入了floor(tp)来解决此问题。

日精度time_point将用于提取年,月和日字段,毫秒精度time_point将用于提取小时,分钟,秒和毫秒字段。直到C 20才会添加上面使用的duration days,但是您可以使用以下方法做到:

1using days = std::chrono::duration;

C。要从tp_d获取年,月和日字段,可以使用一种公共领域算法进行日历操作。这不是第三方图书馆。它是用于编写自己的日历库的算法(这就是我正在解释的内容)。我已经定制了civil_from_days算法,以完全满足format_CET:

的需求

12345678910111213141516// Get {y, m, d} from tp_d auto z = tp_d.time_since_epoch().count(); static_assert(std::numeric_limits::digits >= 18,         "This algorithm has not been ported to a 16 bit unsigned integer"); static_assert(std::numeric_limits::digits >= 20,         "This algorithm has not been ported to a 16 bit signed integer"); z += 719468; const int era = (z >= 0 ? z : z - 146096) / 146097; const unsigned doe = static_cast(z - era * 146097);          // [0, 146096] const unsigned yoe = (doe - doe/1460 + doe/36524 - doe/146096) / 365;  // [0, 399] int y = static_cast(yoe) + era * 400; const unsigned doy = doe - (365*yoe + yoe/4 - yoe/100);                // [0, 365] const unsigned mp = (5*doy + 2)/153;                                   // [0, 11] const unsigned d = doy - (153*mp+2)/5 + 1;                             // [1, 31] const unsigned m = mp + (mp


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3