Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* Portions are Copyright (C) 2011 Google Inc */ | 1 /* Portions are Copyright (C) 2011 Google Inc */ |
| 2 /* ***** BEGIN LICENSE BLOCK ***** | 2 /* ***** BEGIN LICENSE BLOCK ***** |
| 3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | 3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 |
| 4 * | 4 * |
| 5 * The contents of this file are subject to the Mozilla Public License Version | 5 * The contents of this file are subject to the Mozilla Public License Version |
| 6 * 1.1 (the "License"); you may not use this file except in compliance with | 6 * 1.1 (the "License"); you may not use this file except in compliance with |
| 7 * the License. You may obtain a copy of the License at | 7 * the License. You may obtain a copy of the License at |
| 8 * http://www.mozilla.org/MPL/ | 8 * http://www.mozilla.org/MPL/ |
| 9 * | 9 * |
| 10 * Software distributed under the License is distributed on an "AS IS" basis, | 10 * Software distributed under the License is distributed on an "AS IS" basis, |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 54 * PR_GMTParameters | 54 * PR_GMTParameters |
| 55 * PR_ImplodeTime | 55 * PR_ImplodeTime |
| 56 * This was modified to use the Win32 SYSTEMTIME/FILETIME structures | 56 * This was modified to use the Win32 SYSTEMTIME/FILETIME structures |
| 57 * and the timezone offsets are applied to the FILETIME structure. | 57 * and the timezone offsets are applied to the FILETIME structure. |
| 58 * All types and macros are defined in the base/third_party/prtime.h file. | 58 * All types and macros are defined in the base/third_party/prtime.h file. |
| 59 * These have been copied from the following nspr files. We have only copied | 59 * These have been copied from the following nspr files. We have only copied |
| 60 * over the types we need. | 60 * over the types we need. |
| 61 * 1. prtime.h | 61 * 1. prtime.h |
| 62 * 2. prtypes.h | 62 * 2. prtypes.h |
| 63 * 3. prlong.h | 63 * 3. prlong.h |
| 64 * | |
| 65 * Unit tests are in base/time/pr_time_unittest.cc. | |
|
wtc
2014/05/08 21:04:19
Maybe this entire comment block should be moved to
Thiemo Nagel
2014/05/09 16:19:00
I don't have an opinion about that...
| |
| 64 */ | 66 */ |
| 65 | 67 |
| 66 #include "base/logging.h" | 68 #include "base/logging.h" |
| 67 #include "base/third_party/nspr/prtime.h" | 69 #include "base/third_party/nspr/prtime.h" |
| 68 #include "build/build_config.h" | 70 #include "build/build_config.h" |
| 69 | 71 |
| 70 #if defined(OS_WIN) | 72 #if defined(OS_WIN) |
| 71 #include <windows.h> | 73 #include <windows.h> |
| 72 #elif defined(OS_MACOSX) | 74 #elif defined(OS_MACOSX) |
| 73 #include <CoreFoundation/CoreFoundation.h> | 75 #include <CoreFoundation/CoreFoundation.h> |
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 498 * Mon Jan 16 16:12 +0130 1989 | 500 * Mon Jan 16 16:12 +0130 1989 |
| 499 * 6 May 1992 16:41-JST (Wednesday) | 501 * 6 May 1992 16:41-JST (Wednesday) |
| 500 * 22-AUG-1993 10:59:12.82 | 502 * 22-AUG-1993 10:59:12.82 |
| 501 * 22-AUG-1993 10:59pm | 503 * 22-AUG-1993 10:59pm |
| 502 * 22-AUG-1993 12:59am | 504 * 22-AUG-1993 12:59am |
| 503 * 22-AUG-1993 12:59 PM | 505 * 22-AUG-1993 12:59 PM |
| 504 * Friday, August 04, 1995 3:54 PM | 506 * Friday, August 04, 1995 3:54 PM |
| 505 * 06/21/95 04:24:34 PM | 507 * 06/21/95 04:24:34 PM |
| 506 * 20/06/95 21:07 | 508 * 20/06/95 21:07 |
| 507 * 95-06-08 19:32:48 EDT | 509 * 95-06-08 19:32:48 EDT |
| 510 * 1995-06-17T23:11:25.342156Z | |
| 508 * | 511 * |
| 509 * If the input string doesn't contain a description of the timezone, | 512 * If the input string doesn't contain a description of the timezone, |
| 510 * we consult the `default_to_gmt' to decide whether the string should | 513 * we consult the `default_to_gmt' to decide whether the string should |
| 511 * be interpreted relative to the local time zone (PR_FALSE) or GMT (PR_TRUE). | 514 * be interpreted relative to the local time zone (PR_FALSE) or GMT (PR_TRUE). |
| 512 * The correct value for this argument depends on what standard specified | 515 * The correct value for this argument depends on what standard specified |
| 513 * the time string which you are parsing. | 516 * the time string which you are parsing. |
| 514 */ | 517 */ |
| 515 | 518 |
| 516 PRStatus | 519 PRStatus |
| 517 PR_ParseTimeString( | 520 PR_ParseTimeString( |
| 518 const char *string, | 521 const char *string, |
| 519 PRBool default_to_gmt, | 522 PRBool default_to_gmt, |
| 520 PRTime *result_imploded) | 523 PRTime *result_imploded) |
| 521 { | 524 { |
| 522 PRExplodedTime tm; | 525 PRExplodedTime tm; |
| 523 PRExplodedTime *result = &tm; | 526 PRExplodedTime *result = &tm; |
| 524 TIME_TOKEN dotw = TT_UNKNOWN; | 527 TIME_TOKEN dotw = TT_UNKNOWN; |
| 525 TIME_TOKEN month = TT_UNKNOWN; | 528 TIME_TOKEN month = TT_UNKNOWN; |
| 526 TIME_TOKEN zone = TT_UNKNOWN; | 529 TIME_TOKEN zone = TT_UNKNOWN; |
| 527 int zone_offset = -1; | 530 int zone_offset = -1; |
| 528 int dst_offset = 0; | 531 int dst_offset = 0; |
| 529 int date = -1; | 532 int date = -1; |
| 530 PRInt32 year = -1; | 533 PRInt32 year = -1; |
| 531 int hour = -1; | 534 int hour = -1; |
| 532 int min = -1; | 535 int min = -1; |
| 533 int sec = -1; | 536 int sec = -1; |
| 537 int usec = -1; | |
| 534 | 538 |
| 535 const char *rest = string; | 539 const char *rest = string; |
| 536 | 540 |
| 537 int iterations = 0; | 541 int iterations = 0; |
| 538 | 542 |
| 539 PR_ASSERT(string && result); | 543 PR_ASSERT(string && result); |
| 540 if (!string || !result) return PR_FAILURE; | 544 if (!string || !result) return PR_FAILURE; |
| 541 | 545 |
| 542 while (*rest) | 546 while (*rest) |
| 543 { | 547 { |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 767 zone = TT_GMT; | 771 zone = TT_GMT; |
| 768 break; | 772 break; |
| 769 } | 773 } |
| 770 | 774 |
| 771 case '0': case '1': case '2': case '3': case '4': | 775 case '0': case '1': case '2': case '3': case '4': |
| 772 case '5': case '6': case '7': case '8': case '9': | 776 case '5': case '6': case '7': case '8': case '9': |
| 773 { | 777 { |
| 774 int tmp_hour = -1; | 778 int tmp_hour = -1; |
| 775 int tmp_min = -1; | 779 int tmp_min = -1; |
| 776 int tmp_sec = -1; | 780 int tmp_sec = -1; |
| 781 int tmp_usec = -1; | |
| 777 const char *end = rest + 1; | 782 const char *end = rest + 1; |
| 778 while (*end >= '0' && *end <= '9') | 783 while (*end >= '0' && *end <= '9') |
| 779 end++; | 784 end++; |
| 780 | 785 |
| 781 /* end is now the first character after a range of digit s. */ | 786 /* end is now the first character after a range of digit s. */ |
| 782 | 787 |
| 783 if (*end == ':') | 788 if (*end == ':') |
| 784 { | 789 { |
| 785 if (hour >= 0 && min >= 0) /* already got it */ | 790 if (hour >= 0 && min >= 0) /* already got it */ |
| 786 break; | 791 break; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 826 ; | 831 ; |
| 827 else if ((end - rest) > 2) | 832 else if ((end - rest) > 2) |
| 828 /* it is [0-9][0-9][0-9]+: */ | 833 /* it is [0-9][0-9][0-9]+: */ |
| 829 break; | 834 break; |
| 830 else if ((end - rest) == 2) | 835 else if ((end - rest) == 2) |
| 831 tmp_sec = ((rest[0]-'0')*10 + | 836 tmp_sec = ((rest[0]-'0')*10 + |
| 832 (rest[1]-'0')); | 837 (rest[1]-'0')); |
| 833 else | 838 else |
| 834 tmp_sec = (rest[0]-'0'); | 839 tmp_sec = (rest[0]-'0'); |
| 835 | 840 |
| 841 /* fractional second */ | |
| 842 rest = end; | |
| 843 if (*rest == '.') { | |
| 844 rest++; | |
| 845 end++; | |
| 846 tmp_usec = 0; | |
| 847 /* use up to 6 digits, skip over the rest */ | |
| 848 while (*end >= '0' && *end <= '9') { | |
| 849 if (end - rest < 6) { | |
| 850 tmp_usec = tmp_usec * 10 + *end - '0'; | |
| 851 } else if (end - rest == 6) { | |
| 852 if ('5' <= *end && *end <= '9') tmp_usec++ ; /* round to nearest */ | |
|
wtc
2014/05/08 21:04:19
I suggest we always truncate. The reason is that r
Thiemo Nagel
2014/05/09 16:19:00
I wouldn't consider that surprising... ;-)
Anywa
| |
| 853 } | |
| 854 end++; | |
| 855 } | |
| 856 int ndigits = end - rest; | |
| 857 while (ndigits++ < 6) tmp_usec *= 10; | |
|
wtc
2014/05/08 21:04:19
Nit: put
tmp_usec *= 10;
on a separate line.
Thiemo Nagel
2014/05/09 16:19:00
Done.
| |
| 858 } | |
| 859 | |
| 860 rest = end; | |
| 861 if (*rest == 'Z') { | |
|
wtc
2014/05/08 21:04:19
Should we only allow 'Z' if 'T' was used as a deli
Thiemo Nagel
2014/05/09 16:19:00
I wouldn't do that since according to Wikipedia "i
| |
| 862 zone = TT_GMT; | |
| 863 end++; | |
|
wtc
2014/05/08 21:04:19
It seems that we should skip the AM/PM processing
Thiemo Nagel
2014/05/09 16:19:00
Done.
| |
| 864 } | |
| 865 | |
| 836 /* If we made it here, we've parsed hour and min , | 866 /* If we made it here, we've parsed hour and min , |
| 837 and possibly sec, so it worked as a unit. */ | 867 and possibly sec, so it worked as a unit. */ |
| 838 | 868 |
| 839 /* skip over whitespace and see if there's an AM or PM | 869 /* skip over whitespace and see if there's an AM or PM |
| 840 directly following the time. | 870 directly following the time. |
| 841 */ | 871 */ |
| 842 if (tmp_hour <= 12) | 872 if (tmp_hour <= 12) |
| 843 { | 873 { |
| 844 const char *s = end; | 874 const char *s = end; |
| 845 while (*s && (*s == ' ' || *s == '\t')) | 875 while (*s && (*s == ' ' || *s == '\t')) |
| 846 s++; | 876 s++; |
| 847 if ((s[0] == 'p' || s[0] == 'P') && | 877 if ((s[0] == 'p' || s[0] == 'P') && |
| 848 (s[1] == 'm' || s[1] == 'M')) | 878 (s[1] == 'm' || s[1] == 'M')) |
| 849 /* 10:05pm == 22:05, and 12:05pm == 12 :05 */ | 879 /* 10:05pm == 22:05, and 12:05pm == 12 :05 */ |
| 850 tmp_hour = (tmp_hour == 12 ? 12 : tmp_ hour + 12); | 880 tmp_hour = (tmp_hour == 12 ? 12 : tmp_ hour + 12); |
| 851 else if (tmp_hour == 12 && | 881 else if (tmp_hour == 12 && |
| 852 (s[0] == 'a' || s[0] == 'A') && | 882 (s[0] == 'a' || s[0] == 'A') && |
| 853 (s[1] == 'm' || s[1] == 'M')) | 883 (s[1] == 'm' || s[1] == 'M')) |
| 854 /* 12:05am == 00:05 */ | 884 /* 12:05am == 00:05 */ |
| 855 tmp_hour = 0; | 885 tmp_hour = 0; |
| 856 } | 886 } |
| 857 | 887 |
| 858 hour = tmp_hour; | 888 hour = tmp_hour; |
| 859 min = tmp_min; | 889 min = tmp_min; |
| 860 sec = tmp_sec; | 890 sec = tmp_sec; |
| 891 usec = tmp_usec; | |
| 861 rest = end; | 892 rest = end; |
| 862 break; | 893 break; |
| 863 } | 894 } |
| 864 else if ((*end == '/' || *end == '-') && | 895 else if ((*end == '/' || *end == '-') && |
| 865 end[1] >= '0' && end[1] <= '9') | 896 end[1] >= '0' && end[1] <= '9') |
| 866 { | 897 { |
| 867 /* Perhaps this is 6/16/95, 16/6/95, 6-16-95, or 16-6-95 | 898 /* Perhaps this is 6/16/95, 16/6/95, 6-16-95, or 16-6-95 |
| 868 or even 95-06-05... | 899 or even 95-06-05 or 1995-06-22. |
| 869 #### But it doesn't handle 1995-06-22. | |
| 870 */ | 900 */ |
| 871 int n1, n2, n3; | 901 int n1, n2, n3; |
| 872 const char *s; | 902 const char *s; |
| 873 | 903 |
| 874 if (month != TT_UNKNOWN) | 904 if (month != TT_UNKNOWN) |
| 875 /* if we saw a month name, this can't be. */ | 905 /* if we saw a month name, this can't be. */ |
| 876 break; | 906 break; |
| 877 | 907 |
| 878 s = rest; | 908 s = rest; |
| 879 | 909 |
| 880 n1 = (*s++ - '0'); /* first 1 or 2 digits */ | 910 n1 = (*s++ - '0'); /* first 1, 2 or 4 digits */ |
| 881 if (*s >= '0' && *s <= '9') | 911 if (*s >= '0' && *s <= '9') |
| 882 n1 = n1*10 + (*s++ - '0'); | 912 n1 = n1*10 + (*s++ - '0'); |
| 883 | 913 |
| 914 if (*s >= '0' && *s <= '9') /* option al digits 3 and 4 */ | |
| 915 { | |
| 916 n1 = n1*10 + (*s++ - '0'); | |
| 917 if (*s < '0' || *s > '9') | |
| 918 break; | |
| 919 n1 = n1*10 + (*s++ - '0'); | |
| 920 } | |
| 921 | |
| 884 if (*s != '/' && *s != '-') /* sl ash */ | 922 if (*s != '/' && *s != '-') /* sl ash */ |
| 885 break; | 923 break; |
| 886 s++; | 924 s++; |
| 887 | 925 |
| 888 if (*s < '0' || *s > '9') /* seco nd 1 or 2 digits */ | 926 if (*s < '0' || *s > '9') /* seco nd 1 or 2 digits */ |
| 889 break; | 927 break; |
| 890 n2 = (*s++ - '0'); | 928 n2 = (*s++ - '0'); |
| 891 if (*s >= '0' && *s <= '9') | 929 if (*s >= '0' && *s <= '9') |
| 892 n2 = n2*10 + (*s++ - '0'); | 930 n2 = n2*10 + (*s++ - '0'); |
| 893 | 931 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 904 if (*s >= '0' && *s <= '9') /* option al digits 3, 4, and 5 */ | 942 if (*s >= '0' && *s <= '9') /* option al digits 3, 4, and 5 */ |
| 905 { | 943 { |
| 906 n3 = n3*10 + (*s++ - '0'); | 944 n3 = n3*10 + (*s++ - '0'); |
| 907 if (*s < '0' || *s > '9') | 945 if (*s < '0' || *s > '9') |
| 908 break; | 946 break; |
| 909 n3 = n3*10 + (*s++ - '0'); | 947 n3 = n3*10 + (*s++ - '0'); |
| 910 if (*s >= '0' && *s <= '9') | 948 if (*s >= '0' && *s <= '9') |
| 911 n3 = n3*10 + (*s++ - '0'); | 949 n3 = n3*10 + (*s++ - '0'); |
| 912 } | 950 } |
| 913 | 951 |
| 914 if ((*s >= '0' && *s <= '9') || /* follow ed by non-alphanum */ | 952 if (((*s >= '0' && *s <= '9') || /* follo wed by non-alphanum */ |
| 915 (*s >= 'A' && *s <= 'Z') || | 953 (*s >= 'A' && *s <= 'Z') || |
| 916 (*s >= 'a' && *s <= 'z')) | 954 (*s >= 'a' && *s <= 'z')) && |
| 955 !(*s == 'T' && '0' <= s[1] && s[1] <= '9')) /* allow ISO 8601 T delimiter */ | |
|
wtc
2014/05/08 21:04:19
I think we should skip over 'T' right here, so tha
Thiemo Nagel
2014/05/09 16:19:00
We could skip over the 'T' here, but we cannot eli
| |
| 917 break; | 956 break; |
| 918 | 957 |
| 919 /* Ok, we parsed three 1-2 digit numbers, with / or - | 958 /* Ok, we parsed three 1-2 digit numbers, with / or - |
|
wtc
2014/05/08 21:04:19
This comment needs to be updated because "three 1-
Thiemo Nagel
2014/05/09 16:19:00
Done.
| |
| 920 between them. Now decide what the hell they are | 959 between them. Now decide what the hell they are |
| 921 (DD/MM/YY or MM/DD/YY or YY/MM/DD.) | 960 (DD/MM/YY or MM/DD/YY or YY/MM/DD.) |
|
wtc
2014/05/08 21:04:19
The last item should be YY[YY]/MM/DD or [YY]YY/MM/
Thiemo Nagel
2014/05/09 16:19:00
Done.
| |
| 922 */ | 961 */ |
| 923 | 962 |
| 924 if (n1 > 31 || n1 == 0) /* must be YY/MM/DD */ | 963 if (n1 > 31 || n1 == 0) /* must be YY[YY]/MM/DD */ |
|
wtc
2014/05/08 21:04:19
Nit: [YY]YY/MM/DD seems more accurate. Not very su
Thiemo Nagel
2014/05/09 16:19:00
Absolutely!
| |
| 925 { | 964 { |
| 926 if (n2 > 12) break; | 965 if (n2 > 12) break; |
| 927 if (n3 > 31) break; | 966 if (n3 > 31) break; |
| 928 year = n1; | 967 year = n1; |
| 929 if (year < 70) | 968 if (year < 70) |
| 930 year += 2000; | 969 year += 2000; |
| 931 else if (year < 100) | 970 else if (year < 100) |
| 932 year += 1900; | 971 year += 1900; |
| 933 month = (TIME_TOKEN)(n2 + ((int)TT_JAN) - 1); | 972 month = (TIME_TOKEN)(n2 + ((int)TT_JAN) - 1); |
| 934 date = n3; | 973 date = n3; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1019 | 1058 |
| 1020 /* Skip to the end of this token, whether we parsed it or not. | 1059 /* Skip to the end of this token, whether we parsed it or not. |
| 1021 Tokens are delimited by whitespace, or ,;-/ | 1060 Tokens are delimited by whitespace, or ,;-/ |
| 1022 But explicitly not :+-. | 1061 But explicitly not :+-. |
| 1023 */ | 1062 */ |
| 1024 while (*rest && | 1063 while (*rest && |
| 1025 *rest != ' ' && *rest != '\t' && | 1064 *rest != ' ' && *rest != '\t' && |
| 1026 *rest != ',' && *rest != ';' && | 1065 *rest != ',' && *rest != ';' && |
| 1027 *rest != '-' && *rest != '+' && | 1066 *rest != '-' && *rest != '+' && |
| 1028 *rest != '/' && | 1067 *rest != '/' && |
| 1029 *rest != '(' && *rest != ')' && *rest != '[' && *rest ! = ']') | 1068 *rest != '(' && *rest != ')' && *rest != '[' && *rest ! = ']' && |
| 1069 !(*rest == 'T' && '0' <= rest[1] && rest[1] <= '9') /* T precedes time in ISO 8601 */ | |
| 1070 ) | |
| 1030 rest++; | 1071 rest++; |
| 1031 /* skip over uninteresting chars. */ | 1072 /* skip over uninteresting chars. */ |
| 1032 SKIP_MORE: | 1073 SKIP_MORE: |
| 1033 while (*rest && | 1074 while (*rest && |
| 1034 (*rest == ' ' || *rest == '\t' || | 1075 (*rest == ' ' || *rest == '\t' || |
| 1035 *rest == ',' || *rest == ';' || *rest == '/' || | 1076 *rest == ',' || *rest == ';' || *rest == '/' || |
| 1036 *rest == '(' || *rest == ')' || *rest == '[' || *rest == ']')) | 1077 *rest == '(' || *rest == ')' || *rest == '[' || *rest == ']' || |
| 1078 (*rest == 'T' && '0' <= rest[1] && rest[1] <= '9') /* T precedes time in ISO 8601 */ | |
| 1079 ) | |
| 1080 ) | |
| 1037 rest++; | 1081 rest++; |
| 1038 | 1082 |
| 1039 /* "-" is ignored at the beginning of a token if we have not yet | 1083 /* "-" is ignored at the beginning of a token if we have not yet |
| 1040 parsed a year (e.g., the second "-" in "30-AUG-1966"), or if | 1084 parsed a year (e.g., the second "-" in "30-AUG-1966"), or if |
| 1041 the character after the dash is not a digit. */ | 1085 the character after the dash is not a digit. */ |
| 1042 if (*rest == '-' && ((rest > string && | 1086 if (*rest == '-' && ((rest > string && |
| 1043 isalpha((unsigned char)rest[-1]) && year < 0) || | 1087 isalpha((unsigned char)rest[-1]) && year < 0) || |
| 1044 rest[1] < '0' || rest[1] > '9')) | 1088 rest[1] < '0' || rest[1] > '9')) |
| 1045 { | 1089 { |
| 1046 rest++; | 1090 rest++; |
| 1047 goto SKIP_MORE; | 1091 goto SKIP_MORE; |
| 1048 } | 1092 } |
| 1049 | 1093 |
| 1050 } | 1094 } /* while */ |
| 1051 | 1095 |
| 1052 if (zone != TT_UNKNOWN && zone_offset == -1) | 1096 if (zone != TT_UNKNOWN && zone_offset == -1) |
| 1053 { | 1097 { |
| 1054 switch (zone) | 1098 switch (zone) |
| 1055 { | 1099 { |
| 1056 case TT_PST: zone_offset = -8 * 60; break; | 1100 case TT_PST: zone_offset = -8 * 60; break; |
| 1057 case TT_PDT: zone_offset = -8 * 60; dst_offset = 1 * 60; break; | 1101 case TT_PDT: zone_offset = -8 * 60; dst_offset = 1 * 60; break; |
| 1058 case TT_MST: zone_offset = -7 * 60; break; | 1102 case TT_MST: zone_offset = -7 * 60; break; |
| 1059 case TT_MDT: zone_offset = -7 * 60; dst_offset = 1 * 60; break; | 1103 case TT_MDT: zone_offset = -7 * 60; dst_offset = 1 * 60; break; |
| 1060 case TT_CST: zone_offset = -6 * 60; break; | 1104 case TT_CST: zone_offset = -6 * 60; break; |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 1075 } | 1119 } |
| 1076 | 1120 |
| 1077 /* If we didn't find a year, month, or day-of-the-month, we can't | 1121 /* If we didn't find a year, month, or day-of-the-month, we can't |
| 1078 possibly parse this, and in fact, mktime() will do something random | 1122 possibly parse this, and in fact, mktime() will do something random |
| 1079 (I'm seeing it return "Tue Feb 5 06:28:16 2036", which is no doubt | 1123 (I'm seeing it return "Tue Feb 5 06:28:16 2036", which is no doubt |
| 1080 a numerologically significant date... */ | 1124 a numerologically significant date... */ |
| 1081 if (month == TT_UNKNOWN || date == -1 || year == -1 || year > PR_INT16_MAX) | 1125 if (month == TT_UNKNOWN || date == -1 || year == -1 || year > PR_INT16_MAX) |
| 1082 return PR_FAILURE; | 1126 return PR_FAILURE; |
| 1083 | 1127 |
| 1084 memset(result, 0, sizeof(*result)); | 1128 memset(result, 0, sizeof(*result)); |
| 1129 if (usec != -1) | |
| 1130 result->tm_usec = usec; | |
| 1085 if (sec != -1) | 1131 if (sec != -1) |
| 1086 result->tm_sec = sec; | 1132 result->tm_sec = sec; |
| 1087 if (min != -1) | 1133 if (min != -1) |
| 1088 result->tm_min = min; | 1134 result->tm_min = min; |
| 1089 if (hour != -1) | 1135 if (hour != -1) |
| 1090 result->tm_hour = hour; | 1136 result->tm_hour = hour; |
| 1091 if (date != -1) | 1137 if (date != -1) |
| 1092 result->tm_mday = date; | 1138 result->tm_mday = date; |
| 1093 if (month != TT_UNKNOWN) | 1139 if (month != TT_UNKNOWN) |
| 1094 result->tm_month = (((int)month) - ((int)TT_JAN)); | 1140 result->tm_month = (((int)month) - ((int)TT_JAN)); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1197 + 60 * localTime.tm_hour | 1243 + 60 * localTime.tm_hour |
| 1198 + 1440 * (localTime.tm_mday - 2); | 1244 + 1440 * (localTime.tm_mday - 2); |
| 1199 } | 1245 } |
| 1200 | 1246 |
| 1201 result->tm_params.tp_gmt_offset = zone_offset * 60; | 1247 result->tm_params.tp_gmt_offset = zone_offset * 60; |
| 1202 result->tm_params.tp_dst_offset = dst_offset * 60; | 1248 result->tm_params.tp_dst_offset = dst_offset * 60; |
| 1203 | 1249 |
| 1204 *result_imploded = PR_ImplodeTime(result); | 1250 *result_imploded = PR_ImplodeTime(result); |
| 1205 return PR_SUCCESS; | 1251 return PR_SUCCESS; |
| 1206 } | 1252 } |
| OLD | NEW |