@@ -964,6 +964,7 @@ static void dump_node(FormatNode *node, int max);
964
964
965
965
static char * get_th (char * num , int type );
966
966
static char * str_numth (char * dest , char * num , int type );
967
+ static int adjust_partial_year_to_2020 (int year );
967
968
static int strspace_len (char * str );
968
969
static int strdigits_len (char * str );
969
970
static void from_char_set_mode (TmFromChar * tmfc , const FromCharDateMode mode );
@@ -1968,6 +1969,31 @@ is_next_separator(FormatNode *n)
1968
1969
return TRUE; /* some non-digit input (separator) */
1969
1970
}
1970
1971
1972
+
1973
+ static int
1974
+ adjust_partial_year_to_2020 (int year )
1975
+ {
1976
+ /*
1977
+ * Adjust all dates toward 2020; this is effectively what happens
1978
+ * when we assume '70' is 1970 and '69' is 2069.
1979
+ */
1980
+ /* Force 0-69 into the 2000's */
1981
+ if (year < 70 )
1982
+ return year + 2000 ;
1983
+ /* Force 70-99 into the 1900's */
1984
+ else if (year >= 70 && year < 100 )
1985
+ return year + 1900 ;
1986
+ /* Force 100-519 into the 2000's */
1987
+ else if (year >= 100 && year < 519 )
1988
+ return year + 2000 ;
1989
+ /* Force 520-999 into the 1000's */
1990
+ else if (year >= 520 && year < 1000 )
1991
+ return year + 1000 ;
1992
+ else
1993
+ return year ;
1994
+ }
1995
+
1996
+
1971
1997
static int
1972
1998
strspace_len (char * str )
1973
1999
{
@@ -2930,43 +2956,23 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
2930
2956
break ;
2931
2957
case DCH_YYY :
2932
2958
case DCH_IYY :
2933
- from_char_parse_int (& out -> year , & s , n );
2959
+ if (from_char_parse_int (& out -> year , & s , n ) < 4 )
2960
+ out -> year = adjust_partial_year_to_2020 (out -> year );
2934
2961
out -> yysz = 3 ;
2935
-
2936
- /*
2937
- * 3-digit year: '100' ... '999' = 1100 ... 1999 '000' ...
2938
- * '099' = 2000 ... 2099
2939
- */
2940
- if (out -> year >= 100 )
2941
- out -> year += 1000 ;
2942
- else
2943
- out -> year += 2000 ;
2944
2962
s += SKIP_THth (n -> suffix );
2945
2963
break ;
2946
2964
case DCH_YY :
2947
2965
case DCH_IY :
2948
- from_char_parse_int (& out -> year , & s , n );
2966
+ if (from_char_parse_int (& out -> year , & s , n ) < 4 )
2967
+ out -> year = adjust_partial_year_to_2020 (out -> year );
2949
2968
out -> yysz = 2 ;
2950
-
2951
- /*
2952
- * 2-digit year: '00' ... '69' = 2000 ... 2069 '70' ... '99'
2953
- * = 1970 ... 1999
2954
- */
2955
- if (out -> year < 70 )
2956
- out -> year += 2000 ;
2957
- else
2958
- out -> year += 1900 ;
2959
2969
s += SKIP_THth (n -> suffix );
2960
2970
break ;
2961
2971
case DCH_Y :
2962
2972
case DCH_I :
2963
- from_char_parse_int (& out -> year , & s , n );
2973
+ if (from_char_parse_int (& out -> year , & s , n ) < 4 )
2974
+ out -> year = adjust_partial_year_to_2020 (out -> year );
2964
2975
out -> yysz = 1 ;
2965
-
2966
- /*
2967
- * 1-digit year: always +2000
2968
- */
2969
- out -> year += 2000 ;
2970
2976
s += SKIP_THth (n -> suffix );
2971
2977
break ;
2972
2978
case DCH_RM :
0 commit comments