659 lines · cpp
1//===-- Unittests for mktime ----------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "src/__support/CPP/limits.h" // INT_MAX10#include "src/time/mktime.h"11#include "src/time/time_constants.h"12#include "test/UnitTest/ErrnoSetterMatcher.h"13#include "test/UnitTest/Test.h"14#include "test/src/time/TmHelper.h"15#include "test/src/time/TmMatcher.h"16 17using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;18using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;19using LIBC_NAMESPACE::time_constants::Month;20 21#ifndef EOVERFLOW22#define EOVERFLOW 023#endif24 25static inline constexpr int tm_year(int year) {26 return year - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE;27}28 29TEST(LlvmLibcMkTime, FailureSetsErrno) {30 struct tm tm_data{.tm_sec = INT_MAX,31 .tm_min = INT_MAX,32 .tm_hour = INT_MAX,33 .tm_mday = INT_MAX,34 .tm_mon = INT_MAX - 1,35 .tm_year = tm_year(INT_MAX),36 .tm_wday = 0,37 .tm_yday = 0,38 .tm_isdst = 0};39 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data), Fails(EOVERFLOW));40}41 42TEST(LlvmLibcMkTime, InvalidSeconds) {43 {44 // -1 second from 1970-01-01 00:00:00 returns 1969-12-31 23:59:59.45 struct tm tm_data{.tm_sec = -1,46 .tm_min = 0,47 .tm_hour = 0,48 .tm_mday = 1,49 .tm_mon = Month::JANUARY,50 .tm_year = tm_year(1970),51 .tm_wday = 0,52 .tm_yday = 0,53 .tm_isdst = 0};54 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data), Succeeds(-1));55 EXPECT_TM_EQ((tm{.tm_sec = 59,56 .tm_min = 59,57 .tm_hour = 23,58 .tm_mday = 31,59 .tm_mon = Month::DECEMBER,60 .tm_year = tm_year(1969),61 .tm_wday = 3,62 .tm_yday = 364,63 .tm_isdst = 0}),64 tm_data);65 }66 67 {68 // 60 seconds from 1970-01-01 00:00:00 returns 1970-01-01 00:01:00.69 struct tm tm_data{.tm_sec = 60,70 .tm_min = 0,71 .tm_hour = 0,72 .tm_mday = 1,73 .tm_mon = Month::JANUARY,74 .tm_year = tm_year(1970),75 .tm_wday = 0,76 .tm_yday = 0,77 .tm_isdst = 0};78 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data), Succeeds(60));79 EXPECT_TM_EQ((tm{.tm_sec = 0,80 .tm_min = 1,81 .tm_hour = 0,82 .tm_mday = 1,83 .tm_mon = Month::JANUARY,84 .tm_year = tm_year(1970),85 .tm_wday = 4,86 .tm_yday = 0,87 .tm_isdst = 0}),88 tm_data);89 }90}91 92TEST(LlvmLibcMkTime, InvalidMinutes) {93 {94 // -1 minute from 1970-01-01 00:00:00 returns 1969-12-31 23:59:00.95 struct tm tm_data{.tm_sec = 0,96 .tm_min = -1,97 .tm_hour = 0,98 .tm_mday = 1,99 .tm_mon = Month::JANUARY,100 .tm_year = tm_year(1970),101 .tm_wday = 0,102 .tm_yday = 0,103 .tm_isdst = 0};104 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data),105 Succeeds(-LIBC_NAMESPACE::time_constants::SECONDS_PER_MIN));106 EXPECT_TM_EQ((tm{.tm_sec = 0,107 .tm_min = 59,108 .tm_hour = 23,109 .tm_mday = 31,110 .tm_mon = Month::DECEMBER,111 .tm_year = tm_year(1969),112 .tm_wday = 3,113 .tm_yday = 0,114 .tm_isdst = 0}),115 tm_data);116 }117 118 {119 // 60 minutes from 1970-01-01 00:00:00 returns 1970-01-01 01:00:00.120 struct tm tm_data{.tm_sec = 0,121 .tm_min = 60,122 .tm_hour = 0,123 .tm_mday = 1,124 .tm_mon = Month::JANUARY,125 .tm_year = tm_year(1970),126 .tm_wday = 0,127 .tm_yday = 0,128 .tm_isdst = 0};129 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data),130 Succeeds(60 * LIBC_NAMESPACE::time_constants::SECONDS_PER_MIN));131 EXPECT_TM_EQ((tm{.tm_sec = 0,132 .tm_min = 0,133 .tm_hour = 1,134 .tm_mday = 1,135 .tm_mon = Month::JANUARY,136 .tm_year = tm_year(1970),137 .tm_wday = 4,138 .tm_yday = 0,139 .tm_isdst = 0}),140 tm_data);141 }142}143 144TEST(LlvmLibcMkTime, InvalidHours) {145 {146 // -1 hour from 1970-01-01 00:00:00 returns 1969-12-31 23:00:00.147 struct tm tm_data{.tm_sec = 0,148 .tm_min = 0,149 .tm_hour = -1,150 .tm_mday = 1,151 .tm_mon = Month::JANUARY,152 .tm_year = tm_year(1970),153 .tm_wday = 0,154 .tm_yday = 0,155 .tm_isdst = 0};156 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data),157 Succeeds(-LIBC_NAMESPACE::time_constants::SECONDS_PER_HOUR));158 EXPECT_TM_EQ((tm{.tm_sec = 0,159 .tm_min = 0,160 .tm_hour = 23,161 .tm_mday = 31,162 .tm_mon = Month::DECEMBER,163 .tm_year = tm_year(1969),164 .tm_wday = 3,165 .tm_yday = 0,166 .tm_isdst = 0}),167 tm_data);168 }169 170 {171 // 24 hours from 1970-01-01 00:00:00 returns 1970-01-02 00:00:00.172 struct tm tm_data{.tm_sec = 0,173 .tm_min = 0,174 .tm_hour = 24,175 .tm_mday = 1,176 .tm_mon = Month::JANUARY,177 .tm_year = tm_year(1970),178 .tm_wday = 0,179 .tm_yday = 0,180 .tm_isdst = 0};181 EXPECT_THAT(182 LIBC_NAMESPACE::mktime(&tm_data),183 Succeeds(24 * LIBC_NAMESPACE::time_constants::SECONDS_PER_HOUR));184 EXPECT_TM_EQ((tm{.tm_sec = 0,185 .tm_min = 0,186 .tm_hour = 0,187 .tm_mday = 2,188 .tm_mon = Month::JANUARY,189 .tm_year = tm_year(1970),190 .tm_wday = 5,191 .tm_yday = 0,192 .tm_isdst = 0}),193 tm_data);194 }195}196 197TEST(LlvmLibcMkTime, InvalidYear) {198 // -1 year from 1970-01-01 00:00:00 returns 1969-01-01 00:00:00.199 struct tm tm_data{.tm_sec = 0,200 .tm_min = 0,201 .tm_hour = 0,202 .tm_mday = 1,203 .tm_mon = Month::JANUARY,204 .tm_year = tm_year(1969),205 .tm_wday = 0,206 .tm_yday = 0,207 .tm_isdst = 0};208 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data),209 Succeeds(-LIBC_NAMESPACE::time_constants::DAYS_PER_NON_LEAP_YEAR *210 LIBC_NAMESPACE::time_constants::SECONDS_PER_DAY));211 EXPECT_TM_EQ((tm{.tm_sec = 0,212 .tm_min = 0,213 .tm_hour = 0,214 .tm_mday = 1,215 .tm_mon = Month::JANUARY,216 .tm_year = tm_year(1969),217 .tm_wday = 3,218 .tm_yday = 0,219 .tm_isdst = 0}),220 tm_data);221}222 223TEST(LlvmLibcMkTime, InvalidEndOf32BitEpochYear) {224 if (sizeof(time_t) != 4)225 return;226 {227 // 2038-01-19 03:14:08 tests overflow of the second in 2038.228 struct tm tm_data{.tm_sec = 8,229 .tm_min = 14,230 .tm_hour = 3,231 .tm_mday = 19,232 .tm_mon = Month::JANUARY,233 .tm_year = tm_year(2038),234 .tm_wday = 0,235 .tm_yday = 0,236 .tm_isdst = 0};237 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data), Fails(EOVERFLOW));238 }239 240 {241 // 2038-01-19 03:15:07 tests overflow of the minute in 2038.242 struct tm tm_data{.tm_sec = 7,243 .tm_min = 15,244 .tm_hour = 3,245 .tm_mday = 19,246 .tm_mon = Month::JANUARY,247 .tm_year = tm_year(2038),248 .tm_wday = 0,249 .tm_yday = 0,250 .tm_isdst = 0};251 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data), Fails(EOVERFLOW));252 }253 254 {255 // 2038-01-19 04:14:07 tests overflow of the hour in 2038.256 struct tm tm_data{.tm_sec = 7,257 .tm_min = 14,258 .tm_hour = 4,259 .tm_mday = 19,260 .tm_mon = Month::JANUARY,261 .tm_year = tm_year(2038),262 .tm_wday = 0,263 .tm_yday = 0,264 .tm_isdst = 0};265 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data), Fails(EOVERFLOW));266 }267 268 {269 // 2038-01-20 03:14:07 tests overflow of the day in 2038.270 struct tm tm_data{.tm_sec = 7,271 .tm_min = 14,272 .tm_hour = 3,273 .tm_mday = 20,274 .tm_mon = Month::JANUARY,275 .tm_year = tm_year(2038),276 .tm_wday = 0,277 .tm_yday = 0,278 .tm_isdst = 0};279 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data), Fails(EOVERFLOW));280 }281 282 {283 // 2038-02-19 03:14:07 tests overflow of the month in 2038.284 struct tm tm_data{.tm_sec = 7,285 .tm_min = 14,286 .tm_hour = 3,287 .tm_mday = 19,288 .tm_mon = Month::FEBRUARY,289 .tm_year = tm_year(2038),290 .tm_wday = 0,291 .tm_yday = 0,292 .tm_isdst = 0};293 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data), Fails(EOVERFLOW));294 }295 296 {297 // 2039-01-19 03:14:07 tests overflow of the year.298 struct tm tm_data{.tm_sec = 7,299 .tm_min = 14,300 .tm_hour = 3,301 .tm_mday = 19,302 .tm_mon = Month::JANUARY,303 .tm_year = tm_year(2039),304 .tm_wday = 0,305 .tm_yday = 0,306 .tm_isdst = 0};307 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data), Fails(EOVERFLOW));308 }309}310 311TEST(LlvmLibcMkTime, InvalidMonths) {312 {313 // -1 month from 1970-01-01 00:00:00 returns 1969-12-01 00:00:00.314 struct tm tm_data{.tm_sec = 0,315 .tm_min = 0,316 .tm_hour = 0,317 .tm_mday = 0,318 .tm_mon = -1,319 .tm_year = tm_year(1970),320 .tm_wday = 0,321 .tm_yday = 0,322 .tm_isdst = 0};323 EXPECT_THAT(324 LIBC_NAMESPACE::mktime(&tm_data),325 Succeeds(-32 * LIBC_NAMESPACE::time_constants::SECONDS_PER_DAY));326 EXPECT_TM_EQ((tm{.tm_sec = 0,327 .tm_min = 0,328 .tm_hour = 0,329 .tm_mday = 1,330 .tm_mon = Month::DECEMBER,331 .tm_year = tm_year(1969),332 .tm_wday = 1,333 .tm_yday = 0,334 .tm_isdst = 0}),335 tm_data);336 }337 338 {339 // 1970-13-01 00:00:00 returns 1971-01-01 00:00:00.340 struct tm tm_data{.tm_sec = 0,341 .tm_min = 0,342 .tm_hour = 0,343 .tm_mday = 1,344 .tm_mon = 12,345 .tm_year = tm_year(1970),346 .tm_wday = 0,347 .tm_yday = 0,348 .tm_isdst = 0};349 EXPECT_THAT(350 LIBC_NAMESPACE::mktime(&tm_data),351 Succeeds(LIBC_NAMESPACE::time_constants::DAYS_PER_NON_LEAP_YEAR *352 LIBC_NAMESPACE::time_constants::SECONDS_PER_DAY));353 EXPECT_TM_EQ((tm{.tm_sec = 0,354 .tm_min = 0,355 .tm_hour = 0,356 .tm_mday = 1,357 .tm_mon = Month::JANUARY,358 .tm_year = tm_year(1971),359 .tm_wday = 5,360 .tm_yday = 0,361 .tm_isdst = 0}),362 tm_data);363 }364}365 366TEST(LlvmLibcMkTime, InvalidDays) {367 {368 // -1 day from 1970-01-01 00:00:00 returns 1969-12-31 00:00:00.369 struct tm tm_data{.tm_sec = 0,370 .tm_min = 0,371 .tm_hour = 0,372 .tm_mday = (1 - 1),373 .tm_mon = Month::JANUARY,374 .tm_year = tm_year(1970),375 .tm_wday = 0,376 .tm_yday = 0,377 .tm_isdst = 0};378 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data),379 Succeeds(-1 * LIBC_NAMESPACE::time_constants::SECONDS_PER_DAY));380 EXPECT_TM_EQ((tm{.tm_sec = 0,381 .tm_min = 0,382 .tm_hour = 0,383 .tm_mday = 31,384 .tm_mon = Month::DECEMBER,385 .tm_year = tm_year(1969),386 .tm_wday = 3,387 .tm_yday = 0,388 .tm_isdst = 0}),389 tm_data);390 }391 392 {393 // 1970-01-32 00:00:00 returns 1970-02-01 00:00:00.394 struct tm tm_data{.tm_sec = 0,395 .tm_min = 0,396 .tm_hour = 0,397 .tm_mday = 32,398 .tm_mon = Month::JANUARY,399 .tm_year = tm_year(1970),400 .tm_wday = 0,401 .tm_yday = 0,402 .tm_isdst = 0};403 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data),404 Succeeds(31 * LIBC_NAMESPACE::time_constants::SECONDS_PER_DAY));405 EXPECT_TM_EQ((tm{.tm_sec = 0,406 .tm_min = 0,407 .tm_hour = 0,408 .tm_mday = 1,409 .tm_mon = Month::FEBRUARY,410 .tm_year = tm_year(1970),411 .tm_wday = 0,412 .tm_yday = 0,413 .tm_isdst = 0}),414 tm_data);415 }416 417 {418 // 1970-02-29 00:00:00 returns 1970-03-01 00:00:00.419 struct tm tm_data{.tm_sec = 0,420 .tm_min = 0,421 .tm_hour = 0,422 .tm_mday = 29,423 .tm_mon = Month::FEBRUARY,424 .tm_year = tm_year(1970),425 .tm_wday = 0,426 .tm_yday = 0,427 .tm_isdst = 0};428 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data),429 Succeeds(59 * LIBC_NAMESPACE::time_constants::SECONDS_PER_DAY));430 EXPECT_TM_EQ((tm{.tm_sec = 0,431 .tm_min = 0,432 .tm_hour = 0,433 .tm_mday = 1,434 .tm_mon = Month::MARCH,435 .tm_year = tm_year(1970),436 .tm_wday = 0,437 .tm_yday = 0,438 .tm_isdst = 0}),439 tm_data);440 }441 442 {443 // 1972-02-30 00:00:00 returns 1972-03-01 00:00:00.444 struct tm tm_data{.tm_sec = 0,445 .tm_min = 0,446 .tm_hour = 0,447 .tm_mday = 30,448 .tm_mon = Month::FEBRUARY,449 .tm_year = tm_year(1972),450 .tm_wday = 0,451 .tm_yday = 0,452 .tm_isdst = 0};453 EXPECT_THAT(454 LIBC_NAMESPACE::mktime(&tm_data),455 Succeeds(((2 * LIBC_NAMESPACE::time_constants::DAYS_PER_NON_LEAP_YEAR) +456 60) *457 LIBC_NAMESPACE::time_constants::SECONDS_PER_DAY));458 EXPECT_TM_EQ((tm{.tm_sec = 0,459 .tm_min = 0,460 .tm_hour = 0,461 .tm_mday = 1,462 .tm_mon = Month::MARCH,463 .tm_year = tm_year(1972),464 .tm_wday = 3,465 .tm_yday = 0,466 .tm_isdst = 0}),467 tm_data);468 }469}470 471TEST(LlvmLibcMkTime, EndOf32BitEpochYear) {472 // Test for maximum value of a signed 32-bit integer.473 // Test implementation can encode time for Tue 19 January 2038 03:14:07 UTC.474 {475 struct tm tm_data{.tm_sec = 7,476 .tm_min = 14,477 .tm_hour = 3,478 .tm_mday = 19,479 .tm_mon = Month::JANUARY,480 .tm_year = tm_year(2038),481 .tm_wday = 0,482 .tm_yday = 0,483 .tm_isdst = 0};484 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data), Succeeds(0x7FFFFFFF));485 EXPECT_TM_EQ((tm{.tm_sec = 7,486 .tm_min = 14,487 .tm_hour = 3,488 .tm_mday = 19,489 .tm_mon = Month::JANUARY,490 .tm_year = tm_year(2038),491 .tm_wday = 2,492 .tm_yday = 7,493 .tm_isdst = 0}),494 tm_data);495 }496 497 // Now test some times before that, to ensure they are not rejected.498 {499 // 2038-01-19 03:13:59 tests that even a large seconds field is500 // accepted if the minutes field is smaller.501 struct tm tm_data{.tm_sec = 59,502 .tm_min = 13,503 .tm_hour = 3,504 .tm_mday = 19,505 .tm_mon = Month::JANUARY,506 .tm_year = tm_year(2038),507 .tm_wday = 0,508 .tm_yday = 0,509 .tm_isdst = 0};510 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data), Succeeds(0x7FFFFFFF - 8));511 EXPECT_TM_EQ((tm{.tm_sec = 59,512 .tm_min = 13,513 .tm_hour = 3,514 .tm_mday = 19,515 .tm_mon = Month::JANUARY,516 .tm_year = tm_year(2038),517 .tm_wday = 2,518 .tm_yday = 7,519 .tm_isdst = 0}),520 tm_data);521 }522 523 {524 // 2038-01-19 02:59:59 tests that large seconds and minutes are525 // accepted if the hours field is smaller.526 struct tm tm_data{.tm_sec = 59,527 .tm_min = 59,528 .tm_hour = 2,529 .tm_mday = 19,530 .tm_mon = Month::JANUARY,531 .tm_year = tm_year(2038),532 .tm_wday = 0,533 .tm_yday = 0,534 .tm_isdst = 0};535 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data),536 Succeeds(0x7FFFFFFF - 8 -537 14 * LIBC_NAMESPACE::time_constants::SECONDS_PER_MIN));538 EXPECT_TM_EQ((tm{.tm_sec = 59,539 .tm_min = 59,540 .tm_hour = 2,541 .tm_mday = 19,542 .tm_mon = Month::JANUARY,543 .tm_year = tm_year(2038),544 .tm_wday = 2,545 .tm_yday = 7,546 .tm_isdst = 0}),547 tm_data);548 }549 550 {551 // 2038-01-18 23:59:59 tests that large seconds, minutes and hours552 // are accepted if the days field is smaller.553 struct tm tm_data{.tm_sec = 59,554 .tm_min = 59,555 .tm_hour = 23,556 .tm_mday = 18,557 .tm_mon = Month::JANUARY,558 .tm_year = tm_year(2038),559 .tm_wday = 0,560 .tm_yday = 0,561 .tm_isdst = 0};562 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data),563 Succeeds(0x7FFFFFFF - 8 -564 14 * LIBC_NAMESPACE::time_constants::SECONDS_PER_MIN -565 3 * LIBC_NAMESPACE::time_constants::SECONDS_PER_HOUR));566 EXPECT_TM_EQ((tm{.tm_sec = 59,567 .tm_min = 59,568 .tm_hour = 23,569 .tm_mday = 18,570 .tm_mon = Month::JANUARY,571 .tm_year = tm_year(2038),572 .tm_wday = 2,573 .tm_yday = 7,574 .tm_isdst = 0}),575 tm_data);576 }577 578 {579 // 2038-01-18 23:59:59 tests that the final second of 2037 is580 // accepted.581 struct tm tm_data{.tm_sec = 59,582 .tm_min = 59,583 .tm_hour = 23,584 .tm_mday = 31,585 .tm_mon = Month::DECEMBER,586 .tm_year = tm_year(2037),587 .tm_wday = 0,588 .tm_yday = 0,589 .tm_isdst = 0};590 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data),591 Succeeds(0x7FFFFFFF - 8 -592 14 * LIBC_NAMESPACE::time_constants::SECONDS_PER_MIN -593 3 * LIBC_NAMESPACE::time_constants::SECONDS_PER_HOUR -594 18 * LIBC_NAMESPACE::time_constants::SECONDS_PER_DAY));595 EXPECT_TM_EQ((tm{.tm_sec = 59,596 .tm_min = 59,597 .tm_hour = 23,598 .tm_mday = 31,599 .tm_mon = Month::DECEMBER,600 .tm_year = tm_year(2037),601 .tm_wday = 2,602 .tm_yday = 7,603 .tm_isdst = 0}),604 tm_data);605 }606}607 608TEST(LlvmLibcMkTime, Max64BitYear) {609 if (sizeof(time_t) == 4)610 return;611 {612 // Mon Jan 1 12:50:50 2170 (200 years from 1970),613 struct tm tm_data{.tm_sec = 50,614 .tm_min = 50,615 .tm_hour = 12,616 .tm_mday = 1,617 .tm_mon = Month::JANUARY,618 .tm_year = tm_year(2170),619 .tm_wday = 0,620 .tm_yday = 0,621 .tm_isdst = 0};622 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data), Succeeds(6311479850));623 EXPECT_TM_EQ((tm{.tm_sec = 50,624 .tm_min = 50,625 .tm_hour = 12,626 .tm_mday = 1,627 .tm_mon = Month::JANUARY,628 .tm_year = tm_year(2170),629 .tm_wday = 1,630 .tm_yday = 50,631 .tm_isdst = 0}),632 tm_data);633 }634 635 {636 // Test for Tue Jan 1 12:50:50 in 2,147,483,647th year.637 struct tm tm_data{.tm_sec = 50,638 .tm_min = 50,639 .tm_hour = 12,640 .tm_mday = 1,641 .tm_mon = Month::JANUARY,642 .tm_year = tm_year(2147483647),643 .tm_wday = 0,644 .tm_yday = 0,645 .tm_isdst = 0};646 EXPECT_THAT(LIBC_NAMESPACE::mktime(&tm_data), Succeeds(67767976202043050));647 EXPECT_TM_EQ((tm{.tm_sec = 50,648 .tm_min = 50,649 .tm_hour = 12,650 .tm_mday = 1,651 .tm_mon = Month::JANUARY,652 .tm_year = tm_year(2147483647),653 .tm_wday = 2,654 .tm_yday = 50,655 .tm_isdst = 0}),656 tm_data);657 }658}659