823 {
825 str.GetRegularToken(out var tokenType, out var tokenValue, dtfi);
826 int indexBeforeSeparator;
827 char charBeforeSeparator;
828 switch (tokenType)
829 {
830 case TokenType.NumberToken:
831 case TokenType.YearNumberToken:
832 {
833 if (raw.numCount == 3 || tokenValue == -1)
834 {
835 result.SetBadDateTimeFailure();
836 return false;
837 }
838 if (dps ==
DS.T_NNt &&
str.Index <
str.Length - 1)
839 {
840 char c =
str.Value[
str.Index];
841 if (c == '.')
842 {
844 }
845 }
847 {
848 return false;
849 }
850 dtok.num = tokenValue;
851 TokenType separatorToken;
852 if (tokenType == TokenType.YearNumberToken)
853 {
854 if (raw.year == -1)
855 {
856 raw.year = tokenValue;
857 switch (separatorToken =
str.GetSeparatorToken(dtfi, out indexBeforeSeparator, out charBeforeSeparator))
858 {
859 case TokenType.SEP_End:
860 dtok.dtt =
DTT.YearEnd;
861 break;
862 case TokenType.SEP_Am:
863 case TokenType.SEP_Pm:
864 if (raw.timeMark ==
TM.NotSet)
865 {
866 raw.timeMark = ((separatorToken != TokenType.SEP_Am) ?
TM.PM :
TM.
AM);
867 dtok.dtt =
DTT.YearSpace;
868 }
869 else
870 {
871 result.SetBadDateTimeFailure();
872 }
873 break;
874 case TokenType.SEP_Space:
875 dtok.dtt =
DTT.YearSpace;
876 break;
877 case TokenType.SEP_Date:
878 dtok.dtt =
DTT.YearDateSep;
879 break;
880 case TokenType.SEP_Time:
881 if (!raw.hasSameDateAndTimeSeparators)
882 {
883 result.SetBadDateTimeFailure();
884 return false;
885 }
886 dtok.dtt =
DTT.YearDateSep;
887 break;
888 case TokenType.SEP_DateOrOffset:
890 {
891 str.Index = indexBeforeSeparator;
892 str.m_current = charBeforeSeparator;
893 dtok.dtt =
DTT.YearSpace;
894 }
895 else
896 {
897 dtok.dtt =
DTT.YearDateSep;
898 }
899 break;
900 case TokenType.SEP_YearSuff:
901 case TokenType.SEP_MonthSuff:
902 case TokenType.SEP_DaySuff:
903 dtok.dtt =
DTT.NumDatesuff;
904 dtok.suffix = separatorToken;
905 break;
906 case TokenType.SEP_HourSuff:
907 case TokenType.SEP_MinuteSuff:
908 case TokenType.SEP_SecondSuff:
909 dtok.dtt =
DTT.NumTimesuff;
910 dtok.suffix = separatorToken;
911 break;
912 default:
913 result.SetBadDateTimeFailure();
914 return false;
915 }
916 return true;
917 }
918 result.SetBadDateTimeFailure();
919 return false;
920 }
921 switch (separatorToken =
str.GetSeparatorToken(dtfi, out indexBeforeSeparator, out charBeforeSeparator))
922 {
923 case TokenType.SEP_End:
924 dtok.dtt =
DTT.NumEnd;
925 raw.AddNumber(dtok.num);
926 break;
927 case TokenType.SEP_Am:
928 case TokenType.SEP_Pm:
929 if (raw.timeMark ==
TM.NotSet)
930 {
931 raw.timeMark = ((separatorToken != TokenType.SEP_Am) ?
TM.PM :
TM.
AM);
932 dtok.dtt =
DTT.NumAmpm;
934 {
935 return false;
936 }
937 raw.AddNumber(dtok.num);
939 {
940 return false;
941 }
942 }
943 else
944 {
945 result.SetBadDateTimeFailure();
946 }
947 break;
948 case TokenType.SEP_Space:
949 dtok.dtt =
DTT.NumSpace;
950 raw.AddNumber(dtok.num);
951 break;
952 case TokenType.SEP_Date:
953 dtok.dtt =
DTT.NumDatesep;
954 raw.AddNumber(dtok.num);
955 break;
956 case TokenType.SEP_DateOrOffset:
958 {
959 str.Index = indexBeforeSeparator;
960 str.m_current = charBeforeSeparator;
961 dtok.dtt =
DTT.NumSpace;
962 }
963 else
964 {
965 dtok.dtt =
DTT.NumDatesep;
966 }
967 raw.AddNumber(dtok.num);
968 break;
969 case TokenType.SEP_Time:
970 if (raw.hasSameDateAndTimeSeparators && (dps ==
DS.D_Y || dps ==
DS.D_YN || dps ==
DS.D_YNd || dps ==
DS.D_YM || dps ==
DS.D_YMd))
971 {
972 dtok.dtt =
DTT.NumDatesep;
973 raw.AddNumber(dtok.num);
974 }
975 else
976 {
977 dtok.dtt =
DTT.NumTimesep;
978 raw.AddNumber(dtok.num);
979 }
980 break;
981 case TokenType.SEP_YearSuff:
982 try
983 {
984 dtok.num = dtfi.Calendar.ToFourDigitYear(tokenValue);
985 }
986 catch (ArgumentOutOfRangeException)
987 {
988 result.SetBadDateTimeFailure();
989 return false;
990 }
991 dtok.dtt =
DTT.NumDatesuff;
992 dtok.suffix = separatorToken;
993 break;
994 case TokenType.SEP_MonthSuff:
995 case TokenType.SEP_DaySuff:
996 dtok.dtt =
DTT.NumDatesuff;
997 dtok.suffix = separatorToken;
998 break;
999 case TokenType.SEP_HourSuff:
1000 case TokenType.SEP_MinuteSuff:
1001 case TokenType.SEP_SecondSuff:
1002 dtok.dtt =
DTT.NumTimesuff;
1003 dtok.suffix = separatorToken;
1004 break;
1005 case TokenType.SEP_LocalTimeMark:
1006 dtok.dtt =
DTT.NumLocalTimeMark;
1007 raw.AddNumber(dtok.num);
1008 break;
1009 default:
1010 result.SetBadDateTimeFailure();
1011 return false;
1012 }
1013 break;
1014 }
1015 case TokenType.HebrewNumber:
1016 {
1017 TokenType separatorToken;
1018 if (tokenValue >= 100)
1019 {
1020 if (raw.year == -1)
1021 {
1022 raw.year = tokenValue;
1023 TokenType tokenType2 = (separatorToken =
str.GetSeparatorToken(dtfi, out indexBeforeSeparator, out charBeforeSeparator));
1024 if (tokenType2 != TokenType.SEP_End)
1025 {
1026 if (tokenType2 != TokenType.SEP_Space)
1027 {
1029 {
1030 result.SetBadDateTimeFailure();
1031 return false;
1032 }
1033 str.Index = indexBeforeSeparator;
1034 str.m_current = charBeforeSeparator;
1035 dtok.dtt =
DTT.YearSpace;
1036 }
1037 else
1038 {
1039 dtok.dtt =
DTT.YearSpace;
1040 }
1041 }
1042 else
1043 {
1044 dtok.dtt =
DTT.YearEnd;
1045 }
1046 break;
1047 }
1048 result.SetBadDateTimeFailure();
1049 return false;
1050 }
1051 dtok.num = tokenValue;
1052 raw.AddNumber(dtok.num);
1053 switch (separatorToken =
str.GetSeparatorToken(dtfi, out indexBeforeSeparator, out charBeforeSeparator))
1054 {
1055 case TokenType.SEP_End:
1056 dtok.dtt =
DTT.NumEnd;
1057 break;
1058 case TokenType.SEP_Space:
1059 case TokenType.SEP_Date:
1060 dtok.dtt =
DTT.NumDatesep;
1061 break;
1062 case TokenType.SEP_DateOrOffset:
1064 {
1065 str.Index = indexBeforeSeparator;
1066 str.m_current = charBeforeSeparator;
1067 dtok.dtt =
DTT.NumSpace;
1068 }
1069 else
1070 {
1071 dtok.dtt =
DTT.NumDatesep;
1072 }
1073 break;
1074 default:
1075 result.SetBadDateTimeFailure();
1076 return false;
1077 }
1078 break;
1079 }
1080 case TokenType.DayOfWeekToken:
1081 if (raw.dayOfWeek == -1)
1082 {
1083 raw.dayOfWeek = tokenValue;
1084 dtok.dtt =
DTT.DayOfWeek;
1085 break;
1086 }
1087 result.SetBadDateTimeFailure();
1088 return false;
1089 case TokenType.MonthToken:
1090 if (raw.month == -1)
1091 {
1092 TokenType separatorToken;
1093 switch (separatorToken =
str.GetSeparatorToken(dtfi, out indexBeforeSeparator, out charBeforeSeparator))
1094 {
1095 case TokenType.SEP_End:
1096 dtok.dtt =
DTT.MonthEnd;
1097 break;
1098 case TokenType.SEP_Space:
1099 dtok.dtt =
DTT.MonthSpace;
1100 break;
1101 case TokenType.SEP_Date:
1102 dtok.dtt =
DTT.MonthDatesep;
1103 break;
1104 case TokenType.SEP_Time:
1105 if (!raw.hasSameDateAndTimeSeparators)
1106 {
1107 result.SetBadDateTimeFailure();
1108 return false;
1109 }
1110 dtok.dtt =
DTT.MonthDatesep;
1111 break;
1112 case TokenType.SEP_DateOrOffset:
1114 {
1115 str.Index = indexBeforeSeparator;
1116 str.m_current = charBeforeSeparator;
1117 dtok.dtt =
DTT.MonthSpace;
1118 }
1119 else
1120 {
1121 dtok.dtt =
DTT.MonthDatesep;
1122 }
1123 break;
1124 default:
1125 result.SetBadDateTimeFailure();
1126 return false;
1127 }
1128 raw.month = tokenValue;
1129 break;
1130 }
1131 result.SetBadDateTimeFailure();
1132 return false;
1133 case TokenType.EraToken:
1134 if (result.era != -1)
1135 {
1136 result.era = tokenValue;
1138 break;
1139 }
1140 result.SetBadDateTimeFailure();
1141 return false;
1142 case TokenType.JapaneseEraToken:
1144 {
1145 return false;
1146 }
1149 if (result.era != -1)
1150 {
1151 result.era = tokenValue;
1153 break;
1154 }
1155 result.SetBadDateTimeFailure();
1156 return false;
1157 case TokenType.TEraToken:
1159 {
1160 return false;
1161 }
1164 if (result.era != -1)
1165 {
1166 result.era = tokenValue;
1168 break;
1169 }
1170 result.SetBadDateTimeFailure();
1171 return false;
1172 case TokenType.TimeZoneToken:
1173 if ((result.flags & ParseFlags.TimeZoneUsed) != 0)
1174 {
1175 result.SetBadDateTimeFailure();
1176 return false;
1177 }
1178 dtok.dtt =
DTT.TimeZone;
1179 result.flags |= ParseFlags.TimeZoneUsed;
1180 result.timeZoneOffset =
new TimeSpan(0
L);
1181 result.flags |= ParseFlags.TimeZoneUtc;
1182 break;
1183 case TokenType.EndOfString:
1185 break;
1186 case TokenType.Am:
1187 case TokenType.Pm:
1188 if (raw.timeMark ==
TM.NotSet)
1189 {
1190 raw.timeMark = (
TM)tokenValue;
1191 break;
1192 }
1193 result.SetBadDateTimeFailure();
1194 return false;
1195 case TokenType.UnknownToken:
1196 if (
char.IsLetter(
str.m_current))
1197 {
1198 result.SetFailure(ParseFailureKind.FormatWithOriginalDateTimeAndParameter,
"Format_UnknownDateTimeWord",
str.Index);
1199 return false;
1200 }
1201 if ((
str.m_current ==
'-' ||
str.m_current ==
'+') && (result.flags & ParseFlags.TimeZoneUsed) == 0)
1202 {
1205 {
1206 result.flags |= ParseFlags.TimeZoneUsed;
1207 return true;
1208 }
1210 }
1212 {
1213 return true;
1214 }
1215 result.SetBadDateTimeFailure();
1216 return false;
1217 }
1218 return true;
1219 }
static readonly DS[][] s_dateParsingStates
static bool VerifyValidPunctuation(ref __DTString str)
static bool HandleTimeZone(ref __DTString str, ref DateTimeResult result)
static bool ProcessTerminalState(DS dps, ref DateTimeResult result, ref DateTimeStyles styles, ref DateTimeRawInfo raw, DateTimeFormatInfo dtfi)
static bool ParseFraction(ref __DTString str, out double result)
static bool ParseTimeZone(ref __DTString str, ref TimeSpan result)
static Calendar GetDefaultInstance()
static Calendar GetDefaultInstance()