From ab72e310a0dd79e001e082bb5381cf2c8e13faa1 Mon Sep 17 00:00:00 2001 From: ax-6 Date: Thu, 8 Aug 2024 02:39:59 +0800 Subject: [PATCH] The acquisition of time zone deviation still has errors and has not been completed. --- aqvm/base/io/io.c | 2 +- aqvm/base/time/time.c | 313 +++++++++++++++++++--------------- aqvm/base/time/time.h | 27 ++- aqvm/base/time/windows/time.c | 8 +- 4 files changed, 196 insertions(+), 154 deletions(-) diff --git a/aqvm/base/io/io.c b/aqvm/base/io/io.c index ed47033..f94dbe4 100644 --- a/aqvm/base/io/io.c +++ b/aqvm/base/io/io.c @@ -705,4 +705,4 @@ int AqvmBaseIo_vsprintf(char* str, const char* format, va_list arg) { } return 0; -} +} \ No newline at end of file diff --git a/aqvm/base/time/time.c b/aqvm/base/time/time.c index df549cd..99bc0f8 100644 --- a/aqvm/base/time/time.c +++ b/aqvm/base/time/time.c @@ -4,6 +4,7 @@ #include "aqvm/base/time/time.h" +#include #include #include "aqvm/base/io/io.h" @@ -104,82 +105,15 @@ int AqvmBaseTime_gmtime(const time_t timestamp, return 0; } -bool AqvmBaseTime_IsValidTime(const struct AqvmBaseTime_Time* time_info) { - if (time_info == NULL) { - // TODO - return false; - } - if (time_info->year < 1900 || time_info->year > 9999) { - // TODO - return false; - } - if (time_info->month > 12) { - // TODO - return false; - } - if (time_info->day > 31) { - // TODO - return false; - } - if (time_info->hour > 23) { - // TODO - return false; - } - if (time_info->minute > 59) { - // TODO - return false; - } - if (time_info->second > 60) { - // TODO - return false; - } - if (time_info->millisecond > 999) { - // TODO - return false; - } - if (time_info->weekday > 6) { - // TODO - return false; - } - if (time_info->yearday > 366) { - // TODO - return false; - } - if (time_info->offset_hour > 23) { - // TODO - return false; - } - if (time_info->offset_minute > 59) { - // TODO - return false; - } - return true; -} - -int AqvmBaseTime_GetCurrentTime(struct AqvmBaseTime_Time* result) { - if (result == NULL) { - // TODO - return -1; - } - -#ifdef __unix__ - if (AqvmBaseTimeUnix_GetCurrentTime(result) != 0) { - // TODO - return -2; - } -#elif _WIN32 - if (AqvmBaseTimeWindows_GetCurrentTime(result) != 0) { - // TODO - return -3; - } -#else - if (AqvmBaseTime_localtime(time(NULL), result) != 0) { +time_t AqvmBaseTime_mktime(struct AqvmBaseTime_Time* time_info) { + if (!AqvmBaseTime_IsValidTime(time_info)) { // TODO - return -4; + return (time_t)-1; } -#endif - return 0; + struct tm tm; + AqvmBaseTime_ConvertTimeToTm(time_info, &tm); + return mktime(&tm); } int AqvmBaseTime_ConvertTmToTime(const struct tm* time_info, @@ -207,11 +141,11 @@ int AqvmBaseTime_ConvertTmToTime(const struct tm* time_info, int AqvmBaseTime_ConvertTimeToTm(const struct AqvmBaseTime_Time* time_info, struct tm* result) { - if (time_info == NULL || result == NULL) { + if (!AqvmBaseTime_IsValidTime(time_info) || time_info->year < 1900 || + result == NULL) { // TODO return -1; } - result->tm_year = time_info->year - 1900; result->tm_mon = time_info->month - 1; result->tm_mday = time_info->day; @@ -224,78 +158,163 @@ int AqvmBaseTime_ConvertTimeToTm(const struct AqvmBaseTime_Time* time_info, return 0; } -time_t AqvmBaseTime_mktime(struct AqvmBaseTime_Time* time_info) { - if (!AqvmBaseTime_IsValidTime(time_info)) { +int AqvmBaseTime_GetCurrentTime(struct AqvmBaseTime_Time* result) { + if (result == NULL) { // TODO - return (time_t)-1; + return -1; } - struct tm tm; - AqvmBaseTime_ConvertTimeToTm(time_info, &tm); - return mktime(&tm); -} - -bool AqvmBaseTime_IsLeapYear(const struct AqvmBaseTime_Time* time_info) { - if (!AqvmBaseTime_IsValidTime(time_info)) { +#ifdef __unix__ + if (AqvmBaseTimeUnix_GetCurrentTime(result) != 0) { // TODO - return false; + return -2; } +#elif _WIN32 + if (AqvmBaseTimeWindows_GetCurrentTime(result) != 0) { + // TODO + return -3; + } +#else + if (AqvmBaseTime_localtime(time(NULL), result) != 0) { + // TODO + return -4; + } +#endif - return ((time_info->year % 4 == 0 && time_info->year % 100 != 0) || - time_info->year % 400 == 0); + return 0; } -int AqvmBaseTime_SetWeekday(struct AqvmBaseTime_Time* time_info) { - if (!AqvmBaseTime_IsValidTime(time_info)) { +int AqvmBaseTime_GetCurrentTimeString(char* result) { + if (result == NULL) { // TODO return -1; } - int c = time_info->year / 100; - int y = time_info->year % 100; - int m = time_info->month; - int d = time_info->day; - - if ((time_info->year == 1582 && time_info->month == 10 && - time_info->day > 4 && time_info->day < 15)) { + struct AqvmBaseTime_Time current_time; + if (AqvmBaseTime_GetCurrentTime(¤t_time) != 0) { // TODO return -2; } - - if (y < 0) { - ++y; + if (!AqvmBaseTime_IsValidTime(¤t_time)) { + // TODO + return -3; } - if (m < 3) { - m += 12; - --y; + char timezone_offset_string[6]; + if (AqvmBaseTime_GetTimezoneOffsetString(¤t_time, + timezone_offset_string) != 0) { + // TODO + return -4; } - - if (time_info->year < 1582 || - (time_info->year == 1582 && time_info->month < 10) || - (time_info->year == 1582 && time_info->month == 10 && - time_info->day <= 4)) { - time_info->weekday = (-c + y + y / 4 + 13 * (m + 1) / 5 + d + 4) % 7; + if (current_time.year < 0) { + if (AqvmBaseIo_snprintf( + result, 30, "-%04d-%02d-%02dT%02d:%02d:%02d.%03d%s", + current_time.year, current_time.month, current_time.day, + current_time.hour, current_time.minute, current_time.second, + current_time.millisecond, timezone_offset_string) < 0) { + // TODO + return -5; + } + } else { + if (AqvmBaseIo_snprintf( + result, 29, "%04d-%02d-%02dT%02d:%02d:%02d.%03d%s", + current_time.year, current_time.month, current_time.day, + current_time.hour, current_time.minute, current_time.second, + current_time.millisecond, timezone_offset_string) < 0) { + // TODO + return -6; + } } + return 0; +} - time_info->weekday = - (c / 4 - 2 * c + y + y / 4 + 13 * (m + 1) / 5 + d - 1) % 7; +int AqvmBaseTime_GetTimezoneOffsetString( + const struct AqvmBaseTime_Time* time_info, char* result) { + if (!AqvmBaseTime_IsValidTime(time_info) || result == NULL) { + // TODO + return -1; + } + if (time_info->offset_sign == 0) { + if (AqvmBaseIo_snprintf(result, 1, "Z") < 0) { + // TODO + return -2; + } + } else if (time_info->offset_sign > 0) { + if (AqvmBaseIo_snprintf(result, 6, "+%02d:%02d", time_info->offset_hour, + time_info->offset_minute) < 0) { + // TODO + return -3; + } + } else if (time_info->offset_sign < 0) { + if (AqvmBaseIo_snprintf(result, 6, "-%02d:%02d", time_info->offset_hour, + time_info->offset_minute) < 0) { + // TODO + return -4; + } + } return 0; } -int AqvmBaseTime_SetYearday(struct AqvmBaseTime_Time* time_info) { +bool AqvmBaseTime_IsLeapYear(const struct AqvmBaseTime_Time* time_info) { if (!AqvmBaseTime_IsValidTime(time_info)) { // TODO - return -1; + return false; } - int days[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}; - time_info->yearday = days[time_info->month - 1] + time_info->day; - if (time_info->month > 2 && AqvmBaseTime_IsLeapYear(time_info)) { - ++time_info->yearday; - } + return ((time_info->year % 4 == 0 && time_info->year % 100 != 0) || + time_info->year % 400 == 0); +} - return 0; +bool AqvmBaseTime_IsValidTime(const struct AqvmBaseTime_Time* time_info) { + if (time_info == NULL) { + // TODO + return false; + } + if (time_info->year == 0) { + // TODO + return false; + } + if (time_info->month > 12) { + // TODO + return false; + } + if (time_info->day > 31) { + // TODO + return false; + } + if (time_info->hour > 23) { + // TODO + return false; + } + if (time_info->minute > 59) { + // TODO + return false; + } + if (time_info->second > 60) { + // TODO + return false; + } + if (time_info->millisecond > 999) { + // TODO + return false; + } + if (time_info->weekday > 6) { + // TODO + return false; + } + if (time_info->yearday > 366) { + // TODO + return false; + } + if (time_info->offset_hour > 23) { + // TODO + return false; + } + if (time_info->offset_minute > 59) { + // TODO + return false; + } + return true; } int AqvmBaseTime_SetIsdst(struct AqvmBaseTime_Time* time_info) { @@ -318,7 +337,7 @@ int AqvmBaseTime_SetIsdst(struct AqvmBaseTime_Time* time_info) { return 0; } -int AqvmBaseTime_SetTimeZoneOffset(struct AqvmBaseTime_Time* time_info) { +int AqvmBaseTime_SetTimezoneOffset(struct AqvmBaseTime_Time* time_info) { if (!AqvmBaseTime_IsValidTime(time_info)) { // TODO return -1; @@ -340,28 +359,54 @@ int AqvmBaseTime_SetTimeZoneOffset(struct AqvmBaseTime_Time* time_info) { return 0; } -int AqvmBaseTime_GetCurrentTimeString(char* result) { - if (result == NULL) { +int AqvmBaseTime_SetWeekday(struct AqvmBaseTime_Time* time_info) { + if (!AqvmBaseTime_IsValidTime(time_info)) { // TODO return -1; } - struct AqvmBaseTime_Time current_time; - if (AqvmBaseTime_GetCurrentTime(¤t_time) != 0) { + int c = time_info->year / 100; + int y = time_info->year % 100; + int m = time_info->month; + int d = time_info->day; + + if ((time_info->year == 1582 && time_info->month == 10 && + time_info->day > 4 && time_info->day < 15)) { // TODO - // return -2; + return -2; } - if (!AqvmBaseTime_IsValidTime(¤t_time)) { - // TODO - return -3; + + if (y < 0) { + ++y; + } + if (m < 3) { + m += 12; + --y; } - if (AqvmBaseIo_snprintf(result, 29, "%04d-%02d-%02dT%02d:%02d:%02d.%03d%s", - current_time.year, current_time.month, - current_time.day, current_time.hour, - current_time.minute, current_time.second, - current_time.millisecond, "NULL") < 0) { + + if (time_info->year < 1582 || + (time_info->year == 1582 && time_info->month < 10) || + (time_info->year == 1582 && time_info->month == 10 && + time_info->day <= 4)) { + time_info->weekday = (-c + y + y / 4 + 13 * (m + 1) / 5 + d + 4) % 7; + } + + time_info->weekday = + (c / 4 - 2 * c + y + y / 4 + 13 * (m + 1) / 5 + d - 1) % 7; + + return 0; +} + +int AqvmBaseTime_SetYearday(struct AqvmBaseTime_Time* time_info) { + if (!AqvmBaseTime_IsValidTime(time_info)) { // TODO - return -4; + return -1; + } + + int days[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}; + time_info->yearday = days[time_info->month - 1] + time_info->day; + if (time_info->month > 2 && AqvmBaseTime_IsLeapYear(time_info)) { + ++time_info->yearday; } return 0; } \ No newline at end of file diff --git a/aqvm/base/time/time.h b/aqvm/base/time/time.h index e0073a6..924fa53 100644 --- a/aqvm/base/time/time.h +++ b/aqvm/base/time/time.h @@ -31,9 +31,7 @@ int AqvmBaseTime_localtime(const time_t timestamp, int AqvmBaseTime_gmtime(const time_t timestamp, struct AqvmBaseTime_Time* result); -bool AqvmBaseTime_IsValidTime(const struct AqvmBaseTime_Time* time_info); - -int AqvmBaseTime_GetCurrentTime(struct AqvmBaseTime_Time* result); +time_t AqvmBaseTime_mktime(struct AqvmBaseTime_Time* time_info); int AqvmBaseTime_ConvertTmToTime(const struct tm* time_info, struct AqvmBaseTime_Time* result); @@ -41,24 +39,23 @@ int AqvmBaseTime_ConvertTmToTime(const struct tm* time_info, int AqvmBaseTime_ConvertTimeToTm(const struct AqvmBaseTime_Time* time_info, struct tm* result); -time_t AqvmBaseTime_mktime(struct AqvmBaseTime_Time* time_info); +int AqvmBaseTime_GetCurrentTime(struct AqvmBaseTime_Time* result); -bool AqvmBaseTime_IsLeapYear(const struct AqvmBaseTime_Time* time_info); +int AqvmBaseTime_GetCurrentTimeString(char* result); -int AqvmBaseTime_SetWeekday(struct AqvmBaseTime_Time* time_info); +int AqvmBaseTime_GetTimezoneOffsetString( + const struct AqvmBaseTime_Time* time_info, char* result); -int AqvmBaseTime_SetYearday(struct AqvmBaseTime_Time* time_info); +bool AqvmBaseTime_IsLeapYear(const struct AqvmBaseTime_Time* time_info); + +bool AqvmBaseTime_IsValidTime(const struct AqvmBaseTime_Time* time_info); int AqvmBaseTime_SetIsdst(struct AqvmBaseTime_Time* time_info); -int AqvmBaseTime_SetTimeZoneOffset(struct AqvmBaseTime_Time* time_info); +int AqvmBaseTime_SetTimezoneOffset(struct AqvmBaseTime_Time* time_info); -// Get the current time. The current time is then formatted as an ISO 8601 -// compliant string and written to |result|. |result| must not be NULL and must -// be at least 28 characters in length. Returns 0 if successful. -// The format of the string is YYYY-MM-DDThh:mm:ss.mmm[Z/+hhmm/-hhmm]. Each part -// cannot be omitted. The final time offset is set according to the current -// system time zone. -int AqvmBaseTime_GetCurrentTimeString(char* result); +int AqvmBaseTime_SetWeekday(struct AqvmBaseTime_Time* time_info); + +int AqvmBaseTime_SetYearday(struct AqvmBaseTime_Time* time_info); #endif \ No newline at end of file diff --git a/aqvm/base/time/windows/time.c b/aqvm/base/time/windows/time.c index 9d2eb48..4c85379 100644 --- a/aqvm/base/time/windows/time.c +++ b/aqvm/base/time/windows/time.c @@ -96,13 +96,13 @@ int AqvmBaseTimeWindows_GetCurrentTime(struct AqvmBaseTime_Time* result) { // TODO return -4; } - if (AqvmBaseTime_SetTimeZoneOffset(result) != 0) { + if (AqvmBaseTime_SetIsdst(result) != 0) { // TODO - return -5; + // return -5; } - if (AqvmBaseTime_SetIsdst(result) != 0) { + if (AqvmBaseTime_SetTimezoneOffset(result) != 0) { // TODO - return -6; + // return -6; } return 0;