Skip to content

Commit 94e3b9a

Browse files
committed
Add more tests for parse_from_str and specifiers
Add exhaustive set of tests for `DateTime<FixedOffset>::parse_from_str` function and all strftime specifiers. Issue chronotope#1112
1 parent 60fc517 commit 94e3b9a

File tree

2 files changed

+256
-5
lines changed

2 files changed

+256
-5
lines changed

src/datetime/tests.rs

+254-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
use super::DateTime;
2+
use crate::format::{Fixed, ParseResult};
3+
use crate::naive::date::{MAX_YEAR, MIN_YEAR};
24
use crate::naive::{NaiveDate, NaiveTime};
35
use crate::offset::{FixedOffset, TimeZone, Utc};
46
#[cfg(feature = "clock")]
@@ -945,9 +947,258 @@ fn test_parse_from_str() {
945947
}
946948

947949
#[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;
9511202

9521203
// timezone variations
9531204

src/naive/date.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ use crate::{Datelike, TimeDelta, Weekday};
3030
use super::internals::{self, DateImpl, Mdf, Of, YearFlags};
3131
use super::isoweek;
3232

33-
const MAX_YEAR: i32 = internals::MAX_YEAR;
34-
const MIN_YEAR: i32 = internals::MIN_YEAR;
33+
pub(crate) const MAX_YEAR: i32 = internals::MAX_YEAR;
34+
pub(crate) const MIN_YEAR: i32 = internals::MIN_YEAR;
3535

3636
/// A week represented by a [`NaiveDate`] and a [`Weekday`] which is the first
3737
/// day of the week.

0 commit comments

Comments
 (0)