|
1 | 1 | use super::DateTime;
|
| 2 | +use crate::format::{Fixed, ParseResult}; |
| 3 | +use crate::naive::date::{MAX_YEAR, MIN_YEAR}; |
2 | 4 | use crate::naive::{NaiveDate, NaiveTime};
|
3 | 5 | use crate::offset::{FixedOffset, TimeZone, Utc};
|
4 | 6 | #[cfg(feature = "clock")]
|
@@ -945,9 +947,258 @@ fn test_parse_from_str() {
|
945 | 947 | }
|
946 | 948 |
|
947 | 949 | #[test]
|
948 |
| -fn test_datetime_parse_from_str() { |
949 |
| - let dt = ymdhms(&FixedOffset::east(-9 * 60 * 60).unwrap(), 2013, 8, 9, 23, 54, 35); |
950 |
| - let parse = DateTime::parse_from_str; |
| 950 | +fn test_utc_datetime_from_str_with_spaces() { |
| 951 | + let dt = ymdhms_utc(2013, 8, 9, 23, 54, 35); |
| 952 | + |
| 953 | + // with varying spaces - should succeed |
| 954 | + assert_eq!(Utc.datetime_from_str(" Aug 09 2013 23:54:35", " %b %d %Y %H:%M:%S"), Ok(dt),); |
| 955 | + assert_eq!(Utc.datetime_from_str("Aug 09 2013 23:54:35 ", "%b %d %Y %H:%M:%S "), Ok(dt),); |
| 956 | + assert_eq!(Utc.datetime_from_str(" Aug 09 2013 23:54:35 ", " %b %d %Y %H:%M:%S "), Ok(dt),); |
| 957 | + assert_eq!(Utc.datetime_from_str(" Aug 09 2013 23:54:35", " %b %d %Y %H:%M:%S"), Ok(dt),); |
| 958 | + assert_eq!(Utc.datetime_from_str(" Aug 09 2013 23:54:35", " %b %d %Y %H:%M:%S"), Ok(dt),); |
| 959 | + assert_eq!( |
| 960 | + Utc.datetime_from_str("\n\tAug 09 2013 23:54:35 ", "\n\t%b %d %Y %H:%M:%S "), |
| 961 | + Ok(dt), |
| 962 | + ); |
| 963 | + assert_eq!(Utc.datetime_from_str("\tAug 09 2013 23:54:35\t", "\t%b %d %Y %H:%M:%S\t"), Ok(dt),); |
| 964 | + assert_eq!(Utc.datetime_from_str("Aug 09 2013 23:54:35", "%b %d %Y %H:%M:%S"), Ok(dt),); |
| 965 | + assert_eq!(Utc.datetime_from_str("Aug 09 2013 23:54:35", "%b %d %Y %H:%M:%S"), Ok(dt),); |
| 966 | + assert_eq!(Utc.datetime_from_str("Aug 09 2013\t23:54:35", "%b %d %Y\t%H:%M:%S"), Ok(dt),); |
| 967 | + assert_eq!(Utc.datetime_from_str("Aug 09 2013\t\t23:54:35", "%b %d %Y\t\t%H:%M:%S"), Ok(dt),); |
| 968 | + // with varying spaces - should fail |
| 969 | + // leading whitespace in format |
| 970 | + assert!(Utc.datetime_from_str("Aug 09 2013 23:54:35", " %b %d %Y %H:%M:%S").is_err()); |
| 971 | + // trailing whitespace in format |
| 972 | + assert!(Utc.datetime_from_str("Aug 09 2013 23:54:35", "%b %d %Y %H:%M:%S ").is_err()); |
| 973 | + // extra mid-string whitespace in format |
| 974 | + assert!(Utc.datetime_from_str("Aug 09 2013 23:54:35", "%b %d %Y %H:%M:%S").is_err()); |
| 975 | + // mismatched leading whitespace |
| 976 | + assert!(Utc.datetime_from_str("\tAug 09 2013 23:54:35", "\n%b %d %Y %H:%M:%S").is_err()); |
| 977 | + // mismatched trailing whitespace |
| 978 | + assert!(Utc.datetime_from_str("Aug 09 2013 23:54:35 ", "%b %d %Y %H:%M:%S\n").is_err()); |
| 979 | + // mismatched mid-string whitespace |
| 980 | + assert!(Utc.datetime_from_str("Aug 09 2013 23:54:35", "%b %d %Y\t%H:%M:%S").is_err()); |
| 981 | + // trailing whitespace in format |
| 982 | + assert!(Utc.datetime_from_str("Aug 09 2013 23:54:35", "%b %d %Y %H:%M:%S ").is_err()); |
| 983 | + // trailing whitespace (newline) in format |
| 984 | + assert!(Utc.datetime_from_str("Aug 09 2013 23:54:35", "%b %d %Y %H:%M:%S\n").is_err()); |
| 985 | + // leading space in data |
| 986 | + assert!(Utc.datetime_from_str(" Aug 09 2013 23:54:35", "%b %d %Y %H:%M:%S").is_err()); |
| 987 | + // trailing space in data |
| 988 | + assert!(Utc.datetime_from_str("Aug 09 2013 23:54:35 ", "%b %d %Y %H:%M:%S").is_err()); |
| 989 | + // trailing tab in data |
| 990 | + assert!(Utc.datetime_from_str("Aug 09 2013 23:54:35\t", "%b %d %Y %H:%M:%S").is_err()); |
| 991 | + // mismatched newlines |
| 992 | + assert!(Utc.datetime_from_str("\nAug 09 2013 23:54:35", "%b %d %Y %H:%M:%S\n").is_err()); |
| 993 | + // trailing literal in data |
| 994 | + assert!(Utc.datetime_from_str("Aug 09 2013 23:54:35 !!!", "%b %d %Y %H:%M:%S ").is_err()); |
| 995 | +} |
| 996 | + |
| 997 | +/// Test `parse_from_str` focused on strftime `%Y`, `%y`, and `%C` specifiers. |
| 998 | +#[test] |
| 999 | +fn test_datetime_parse_from_str_year() { |
| 1000 | + fn parse(data: &str, format: &str) -> ParseResult<DateTime<FixedOffset>> { |
| 1001 | + eprintln!("parse: data: {:?}, format: {:?}", data, format); |
| 1002 | + DateTime::<FixedOffset>::parse_from_str(data, format) |
| 1003 | + } |
| 1004 | + fn parse_year(data: &str, format: &str) -> i32 { |
| 1005 | + eprintln!("parse_year: data: {:?}, format: {:?}", data, format); |
| 1006 | + DateTime::<FixedOffset>::parse_from_str(data, format).unwrap().year() |
| 1007 | + } |
| 1008 | + let dt = ymdhms(&FixedOffset::east_opt(-9 * 60 * 60).unwrap(), 2013, 8, 9, 23, 54, 35); |
| 1009 | + |
| 1010 | + // |
| 1011 | + // %Y |
| 1012 | + // |
| 1013 | + // ok |
| 1014 | + assert_eq!(parse("2013-08-09T23:54:35 -0900", "%Y-%m-%dT%H:%M:%S %z"), Ok(dt)); |
| 1015 | + assert_eq!(parse("08-2013-09T23:54:35 -0900", "%m-%Y-%dT%H:%M:%S %z"), Ok(dt)); |
| 1016 | + assert_eq!(parse_year("9999-08-09T23:54:35 -0900", "%Y-%m-%dT%H:%M:%S %z"), 9999); |
| 1017 | + assert_eq!(parse_year("999-08-09T23:54:35 -0900", "%Y-%m-%dT%H:%M:%S %z"), 999); |
| 1018 | + assert_eq!(parse_year("99-08-09T23:54:35 -0900", "%Y-%m-%dT%H:%M:%S %z"), 99); |
| 1019 | + assert_eq!(parse_year("9-08-09T23:54:35 -0900", "%Y-%m-%dT%H:%M:%S %z"), 9); |
| 1020 | + assert_eq!(parse_year("0-08-09T23:54:35 -0900", "%Y-%m-%dT%H:%M:%S %z"), 0); |
| 1021 | + let d1: String = MIN_YEAR.to_string() + "-08-09T23:54:35 -0900"; |
| 1022 | + assert_eq!(parse_year(d1.as_str(), "%Y-%m-%dT%H:%M:%S %z"), MIN_YEAR); |
| 1023 | + let d1: String = (MIN_YEAR + 1).to_string() + "-08-09T23:54:35 -0900"; |
| 1024 | + assert_eq!(parse_year(d1.as_str(), "%Y-%m-%dT%H:%M:%S %z"), MIN_YEAR + 1); |
| 1025 | + // errors |
| 1026 | + // XXX: MAX_YEAR cannont be parsed, can only parse up to four decimal digits |
| 1027 | + let d1: String = MAX_YEAR.to_string() + "-08-09T23:54:35 -0900"; |
| 1028 | + assert!(parse(d1.as_str(), "%Y-%m-%dT%H:%M:%S %z").is_err()); |
| 1029 | + assert!(parse("99999-08-09T23:54:35 -0900", "%Y-%m-%dT%H:%M:%S %z").is_err()); |
| 1030 | + assert!(parse("A-08-09T23:54:35 -0900", "%Y-%m-%dT%H:%M:%S %z").is_err()); |
| 1031 | + assert!(parse("0x11-08-09T23:54:35 -0900", "%Y-%m-%dT%H:%M:%S %z").is_err()); |
| 1032 | + assert!(parse("108-09T23:54:35 -0900", "%Y%m-%dT%H:%M:%S %z").is_err()); |
| 1033 | + |
| 1034 | + // |
| 1035 | + // %y |
| 1036 | + // |
| 1037 | + // ok |
| 1038 | + assert_eq!(parse("13-08-09T23:54:35 -0900", "%y-%m-%dT%H:%M:%S %z"), Ok(dt)); |
| 1039 | + assert_eq!(parse("08-13-09T23:54:35 -0900", "%m-%y-%dT%H:%M:%S %z"), Ok(dt)); |
| 1040 | + assert_eq!(parse_year("0-08-09T23:54:35 -0900", "%y-%m-%dT%H:%M:%S %z"), 2000); |
| 1041 | + assert_eq!(parse_year("99-08-09T23:54:35 -0900", "%y-%m-%dT%H:%M:%S %z"), 1999); |
| 1042 | + assert_eq!(parse_year("108-09T23:54:35 -0900", "%y%m-%dT%H:%M:%S %z"), 2010); |
| 1043 | + assert_eq!(parse_year("081-09T23:54:35 -0900", "%m%y-%dT%H:%M:%S %z"), 2001); |
| 1044 | + // errors |
| 1045 | + assert!(parse("999-08-09T23:54:35 -0900", "%y-%m-%dT%H:%M:%S %z").is_err()); |
| 1046 | + assert!(parse("100-08-09T23:54:35 -0900", "%y-%m-%dT%H:%M:%S %z").is_err()); |
| 1047 | + assert!(parse("013-08-09T23:54:35 -0900", "%y-%m-%dT%H:%M:%S %z").is_err()); |
| 1048 | + assert!(parse("0x11-08-09T23:54:35 -0900", "%y-%m-%dT%H:%M:%S %z").is_err()); |
| 1049 | + assert!(parse("A-08-09T23:54:35 -0900", "%y-%m-%dT%H:%M:%S %z").is_err()); |
| 1050 | + |
| 1051 | + // |
| 1052 | + // %C |
| 1053 | + // |
| 1054 | + // ok |
| 1055 | + assert_eq!(parse("2013-08-09T23:54:35 -0900", "%C%y-%m-%dT%H:%M:%S %z"), Ok(dt)); |
| 1056 | + assert_eq!(parse("20_13-08-09T23:54:35 -0900", "%C_%y-%m-%dT%H:%M:%S %z"), Ok(dt)); |
| 1057 | + assert_eq!(parse_year("0_13-08-09T23:54:35 -0900", "%C_%y-%m-%dT%H:%M:%S %z"), 13); |
| 1058 | + assert_eq!(parse_year("9_13-08-09T23:54:35 -0900", "%C_%y-%m-%dT%H:%M:%S %z"), 913); |
| 1059 | + assert_eq!(parse_year("99_13-08-09T23:54:35 -0900", "%C_%y-%m-%dT%H:%M:%S %z"), 9913); |
| 1060 | + assert_eq!(parse_year("013-08-09T23:54:35 -0900", "%C%y-%m-%dT%H:%M:%S %z"), 103); |
| 1061 | + assert_eq!(parse_year("113-08-09T23:54:35 -0900", "%C%y-%m-%dT%H:%M:%S %z"), 1103); |
| 1062 | + assert_eq!(parse_year("223-08-09T23:54:35 -0900", "%C%y-%m-%dT%H:%M:%S %z"), 2203); |
| 1063 | + assert_eq!(parse_year("553-08-09T23:54:35 -0900", "%C%y-%m-%dT%H:%M:%S %z"), 5503); |
| 1064 | + assert_eq!(parse_year("993-08-09T23:54:35 -0900", "%C%y-%m-%dT%H:%M:%S %z"), 9903); |
| 1065 | + assert_eq!(parse_year("9923-08-09T23:54:35 -0900", "%C%y-%m-%dT%H:%M:%S %z"), 9923); |
| 1066 | + // errors |
| 1067 | + assert!(parse("913_2-08-09T23:54:35 -0900", "%C_%y-%m-%dT%H:%M:%S %z").is_err()); |
| 1068 | + assert!(parse("9913-08-09T23:54:35 -0900", "%C_%y-%m-%dT%H:%M:%S %z").is_err()); |
| 1069 | + assert!(parse("99923-08-09T23:54:35 -0900", "%C%y-%m-%dT%H:%M:%S %z").is_err()); |
| 1070 | + assert!(parse("20-13-09T23:54:35 -0900", "%m-%C-%dT%H:%M:%S %z").is_err()); |
| 1071 | + assert!(parse("999_01-08-09T23:54:35 -0900", "%C_%y-%m-%dT%H:%M:%S %z").is_err()); |
| 1072 | + assert!(parse("100_01-08-09T23:54:35 -0900", "%C_%y-%m-%dT%H:%M:%S %z").is_err()); |
| 1073 | + assert!(parse("0x11-08-09T23:54:35 -0900", "%C-%m-%dT%H:%M:%S %z").is_err()); |
| 1074 | + assert!(parse("A-08-09T23:54:35 -0900", "%C-%m-%dT%H:%M:%S %z").is_err()); |
| 1075 | +} |
| 1076 | + |
| 1077 | +/// Test `parse_from_str` focused on strftime `%m`, `%b`, `%h`, and `%B` specifiers. |
| 1078 | +#[test] |
| 1079 | +fn test_datetime_parse_from_str_month() { |
| 1080 | + fn parse(data: &str, format: &str) -> ParseResult<DateTime<FixedOffset>> { |
| 1081 | + eprintln!("parse: data: {:?}, format: {:?}", data, format); |
| 1082 | + DateTime::<FixedOffset>::parse_from_str(data, format) |
| 1083 | + } |
| 1084 | + fn parse_month(data: &str, format: &str) -> u32 { |
| 1085 | + eprintln!("parse_month: data: {:?}, format: {:?}", data, format); |
| 1086 | + DateTime::<FixedOffset>::parse_from_str(data, format).unwrap().month() |
| 1087 | + } |
| 1088 | + let dt = ymdhms(&FixedOffset::east_opt(-9 * 60 * 60).unwrap(), 2013, 8, 9, 23, 54, 35); |
| 1089 | + |
| 1090 | + // |
| 1091 | + // %m |
| 1092 | + // |
| 1093 | + // ok |
| 1094 | + assert_eq!(parse("2013-08-09T23:54:35 -0900", "%Y-%m-%dT%H:%M:%S %z"), Ok(dt)); |
| 1095 | + assert_eq!(parse("201308-09T23:54:35 -0900", "%Y%m-%dT%H:%M:%S %z"), Ok(dt)); |
| 1096 | + assert_eq!(parse("2013-0809T23:54:35 -0900", "%Y-%m%dT%H:%M:%S %z"), Ok(dt)); |
| 1097 | + assert_eq!(parse("20130809T23:54:35 -0900", "%Y%m%dT%H:%M:%S %z"), Ok(dt)); |
| 1098 | + assert_eq!(parse("20130809235435-0900", "%Y%m%d%H%M%S%z"), Ok(dt)); |
| 1099 | + assert_eq!(parse_month("20130109235435-0900", "%Y%m%d%H%M%S%z"), 1); |
| 1100 | + assert_eq!(parse_month("20131209235435-0900", "%Y%m%d%H%M%S%z"), 12); |
| 1101 | + // errors |
| 1102 | + assert!(parse("2013-00-09T23:54:35 -0900", "%Y-%m-%dT%H:%M:%S %z").is_err()); |
| 1103 | + assert!(parse("2013-13-09T23:54:35 -0900", "%Y-%m-%dT%H:%M:%S %z").is_err()); |
| 1104 | + assert!(parse("2013-55-09T23:54:35 -0900", "%Y-%m-%dT%H:%M:%S %z").is_err()); |
| 1105 | + assert!(parse("2013-99-09T23:54:35 -0900", "%Y-%m-%dT%H:%M:%S %z").is_err()); |
| 1106 | + assert!(parse("2013-123-09T23:54:35 -0900", "%Y-%m-%dT%H:%M:%S %z").is_err()); |
| 1107 | + |
| 1108 | + // |
| 1109 | + // %b |
| 1110 | + // |
| 1111 | + // ok |
| 1112 | + assert_eq!(parse("2013-Aug-09T23:54:35 -0900", "%Y-%b-%dT%H:%M:%S %z"), Ok(dt)); |
| 1113 | + assert_eq!(parse("2013aug-09T23:54:35 -0900", "%Y%b-%dT%H:%M:%S %z"), Ok(dt)); |
| 1114 | + assert_eq!(parse("2013-AUG09T23:54:35 -0900", "%Y-%b%dT%H:%M:%S %z"), Ok(dt)); |
| 1115 | + assert_eq!(parse("2013aug09T23:54:35 -0900", "%Y%b%dT%H:%M:%S %z"), Ok(dt)); |
| 1116 | + assert_eq!(parse("2013aug09235435-0900", "%Y%b%d%H%M%S%z"), Ok(dt)); |
| 1117 | + assert_eq!(parse_month("2013jan09235435-0900", "%Y%b%d%H%M%S%z"), 1); |
| 1118 | + assert_eq!(parse_month("2013feb09235435-0900", "%Y%b%d%H%M%S%z"), 2); |
| 1119 | + assert_eq!(parse_month("2013mar09235435-0900", "%Y%b%d%H%M%S%z"), 3); |
| 1120 | + assert_eq!(parse_month("2013apr09235435-0900", "%Y%b%d%H%M%S%z"), 4); |
| 1121 | + assert_eq!(parse_month("2013may09235435-0900", "%Y%b%d%H%M%S%z"), 5); |
| 1122 | + assert_eq!(parse_month("2013jun09235435-0900", "%Y%b%d%H%M%S%z"), 6); |
| 1123 | + assert_eq!(parse_month("2013jul09235435-0900", "%Y%b%d%H%M%S%z"), 7); |
| 1124 | + assert_eq!(parse_month("2013aug09235435-0900", "%Y%b%d%H%M%S%z"), 8); |
| 1125 | + assert_eq!(parse_month("2013sep09235435-0900", "%Y%b%d%H%M%S%z"), 9); |
| 1126 | + assert_eq!(parse_month("2013oct09235435-0900", "%Y%b%d%H%M%S%z"), 10); |
| 1127 | + assert_eq!(parse_month("2013nov09235435-0900", "%Y%b%d%H%M%S%z"), 11); |
| 1128 | + assert_eq!(parse_month("2013dec09235435-0900", "%Y%b%d%H%M%S%z"), 12); |
| 1129 | + // errors |
| 1130 | + assert!(parse("2013-AWG-09T23:54:35 -0900", "%Y-%b-%dT%H:%M:%S %z").is_err()); |
| 1131 | + assert!(parse("2013-AU-09T23:54:35 -0900", "%Y-%b-%dT%H:%M:%S %z").is_err()); |
| 1132 | + assert!(parse("2013-AG-09T23:54:35 -0900", "%Y-%b-%dT%H:%M:%S %z").is_err()); |
| 1133 | + assert!(parse("2013-AUG.-09T23:54:35 -0900", "%Y-%b-%dT%H:%M:%S %z").is_err()); |
| 1134 | + assert!(parse("2013-AUGU-09T23:54:35 -0900", "%Y-%b-%dT%H:%M:%S %z").is_err()); |
| 1135 | + assert!(parse("2013-AUGUST-09T23:54:35 -0900", "%Y-%b-%dT%H:%M:%S %z").is_err()); |
| 1136 | + |
| 1137 | + // |
| 1138 | + // %h |
| 1139 | + // |
| 1140 | + // ok |
| 1141 | + assert_eq!(parse("2013-Aug-09T23:54:35 -0900", "%Y-%h-%dT%H:%M:%S %z"), Ok(dt)); |
| 1142 | + assert_eq!(parse("2013aug-09T23:54:35 -0900", "%Y%h-%dT%H:%M:%S %z"), Ok(dt)); |
| 1143 | + assert_eq!(parse("2013-AUG09T23:54:35 -0900", "%Y-%h%dT%H:%M:%S %z"), Ok(dt)); |
| 1144 | + assert_eq!(parse("2013aug09T23:54:35 -0900", "%Y%h%dT%H:%M:%S %z"), Ok(dt)); |
| 1145 | + assert_eq!(parse("2013aug09235435-0900", "%Y%h%d%H%M%S%z"), Ok(dt)); |
| 1146 | + assert_eq!(parse_month("2013jan09235435-0900", "%Y%h%d%H%M%S%z"), 1); |
| 1147 | + assert_eq!(parse_month("2013feb09235435-0900", "%Y%h%d%H%M%S%z"), 2); |
| 1148 | + assert_eq!(parse_month("2013mar09235435-0900", "%Y%h%d%H%M%S%z"), 3); |
| 1149 | + assert_eq!(parse_month("2013apr09235435-0900", "%Y%h%d%H%M%S%z"), 4); |
| 1150 | + assert_eq!(parse_month("2013may09235435-0900", "%Y%h%d%H%M%S%z"), 5); |
| 1151 | + assert_eq!(parse_month("2013jun09235435-0900", "%Y%h%d%H%M%S%z"), 6); |
| 1152 | + assert_eq!(parse_month("2013jul09235435-0900", "%Y%h%d%H%M%S%z"), 7); |
| 1153 | + assert_eq!(parse_month("2013aug09235435-0900", "%Y%h%d%H%M%S%z"), 8); |
| 1154 | + assert_eq!(parse_month("2013sep09235435-0900", "%Y%h%d%H%M%S%z"), 9); |
| 1155 | + assert_eq!(parse_month("2013oct09235435-0900", "%Y%h%d%H%M%S%z"), 10); |
| 1156 | + assert_eq!(parse_month("2013nov09235435-0900", "%Y%h%d%H%M%S%z"), 11); |
| 1157 | + assert_eq!(parse_month("2013dec09235435-0900", "%Y%h%d%H%M%S%z"), 12); |
| 1158 | + // errors |
| 1159 | + assert!(parse("2013-AWG-09T23:54:35 -0900", "%Y-%h-%dT%H:%M:%S %z").is_err()); |
| 1160 | + assert!(parse("2013-AU-09T23:54:35 -0900", "%Y-%h-%dT%H:%M:%S %z").is_err()); |
| 1161 | + assert!(parse("2013-AG-09T23:54:35 -0900", "%Y-%h-%dT%H:%M:%S %z").is_err()); |
| 1162 | + assert!(parse("2013-AUG.-09T23:54:35 -0900", "%Y-%h-%dT%H:%M:%S %z").is_err()); |
| 1163 | + assert!(parse("2013-AUGU-09T23:54:35 -0900", "%Y-%h-%dT%H:%M:%S %z").is_err()); |
| 1164 | + assert!(parse("2013-AUGUST-09T23:54:35 -0900", "%Y-%h-%dT%H:%M:%S %z").is_err()); |
| 1165 | + |
| 1166 | + // |
| 1167 | + // %B |
| 1168 | + // |
| 1169 | + // ok |
| 1170 | + assert_eq!(parse("2013-August-09T23:54:35 -0900", "%Y-%B-%dT%H:%M:%S %z"), Ok(dt)); |
| 1171 | + assert_eq!(parse("2013-aUgUsT-09T23:54:35 -0900", "%Y-%B-%dT%H:%M:%S %z"), Ok(dt)); |
| 1172 | + assert_eq!(parse("2013-august-09T23:54:35 -0900", "%Y-%B-%dT%H:%M:%S %z"), Ok(dt)); |
| 1173 | + assert_eq!(parse("2013august-09T23:54:35 -0900", "%Y%B-%dT%H:%M:%S %z"), Ok(dt)); |
| 1174 | + assert_eq!(parse("2013-AUGust09T23:54:35 -0900", "%Y-%B%dT%H:%M:%S %z"), Ok(dt)); |
| 1175 | + assert_eq!(parse("2013august09T23:54:35 -0900", "%Y%B%dT%H:%M:%S %z"), Ok(dt)); |
| 1176 | + assert_eq!(parse("2013august09235435-0900", "%Y%B%d%H%M%S%z"), Ok(dt)); |
| 1177 | + assert_eq!(parse_month("2013january09235435-0900", "%Y%B%d%H%M%S%z"), 1); |
| 1178 | + assert_eq!(parse_month("2013february09235435-0900", "%Y%B%d%H%M%S%z"), 2); |
| 1179 | + assert_eq!(parse_month("2013march09235435-0900", "%Y%B%d%H%M%S%z"), 3); |
| 1180 | + assert_eq!(parse_month("2013april09235435-0900", "%Y%B%d%H%M%S%z"), 4); |
| 1181 | + assert_eq!(parse_month("2013may09235435-0900", "%Y%B%d%H%M%S%z"), 5); |
| 1182 | + assert_eq!(parse_month("2013june09235435-0900", "%Y%B%d%H%M%S%z"), 6); |
| 1183 | + assert_eq!(parse_month("2013july09235435-0900", "%Y%B%d%H%M%S%z"), 7); |
| 1184 | + assert_eq!(parse_month("2013august09235435-0900", "%Y%B%d%H%M%S%z"), 8); |
| 1185 | + assert_eq!(parse_month("2013september09235435-0900", "%Y%B%d%H%M%S%z"), 9); |
| 1186 | + assert_eq!(parse_month("2013october09235435-0900", "%Y%B%d%H%M%S%z"), 10); |
| 1187 | + assert_eq!(parse_month("2013november09235435-0900", "%Y%B%d%H%M%S%z"), 11); |
| 1188 | + assert_eq!(parse_month("2013december09235435-0900", "%Y%B%d%H%M%S%z"), 12); |
| 1189 | + // errors |
| 1190 | + assert!(parse("2013-AUGUS-09T23:54:35 -0900", "%Y-%B-%dT%H:%M:%S %z").is_err()); |
| 1191 | + assert!(parse("2013-AUGU-09T23:54:35 -0900", "%Y-%B-%dT%H:%M:%S %z").is_err()); |
| 1192 | + assert!(parse("2013-AUG.-09T23:54:35 -0900", "%Y-%B-%dT%H:%M:%S %z").is_err()); |
| 1193 | + assert!(parse("2013-AG-09T23:54:35 -0900", "%Y-%B-%dT%H:%M:%S %z").is_err()); |
| 1194 | + assert!(parse("2013-A-09T23:54:35 -0900", "%Y-%B-%dT%H:%M:%S %z").is_err()); |
| 1195 | +} |
| 1196 | + |
| 1197 | +/// Test `parse_from_str` focused on strftime `%Z`, `%z`, `%:z`, and `%::z` specifiers. |
| 1198 | +#[test] |
| 1199 | +fn test_datetime_parse_from_str_timezone() { |
| 1200 | + let dt = ymdhms(&FixedOffset::east_opt(-9 * 60 * 60).unwrap(), 2013, 8, 9, 23, 54, 35); |
| 1201 | + let parse = DateTime::<FixedOffset>::parse_from_str; |
951 | 1202 |
|
952 | 1203 | // timezone variations
|
953 | 1204 |
|
|
0 commit comments