@@ -965,8 +965,35 @@ mod tests {
965965 use super::*;
966966
967967 use std::f64;
968- use std::os;
969968 use std::result::{Err, Ok};
969+ use std::libc;
970+
971+ #[cfg(windows)]
972+ #[fixed_stack_segment]
973+ fn set_time_zone() {
974+ // Windows crt doesn't see any environment variable set by
975+ // `SetEnvironmentVariable`, which `os::setenv` internally uses.
976+ // It is why we use `putenv` here.
977+ extern {
978+ fn _putenv(envstring: *libc::c_char) -> libc::c_int;
979+ }
980+
981+ unsafe {
982+ // Windows does not understand " America /Los_Angeles ".
983+ // PST+08 may look wrong, but not! "PST" indicates
984+ // the name of timezone. "+08" means UTC = local + 08.
985+ do "TZ =PST +08 ". with_c_str |env| {
986+ _putenv ( env) ;
987+ }
988+ }
989+ tzset( ) ;
990+ }
991+ #[ cfg ( not ( windows) ) ]
992+ fn set_time_zone( ) {
993+ use std:: os;
994+ os:: setenv( "TZ" , "America/Los_Angeles" ) ;
995+ tzset( ) ;
996+ }
970997
971998 fn test_get_time ( ) {
972999 static SOME_RECENT_DATE : i64 = 1325376000i64 ; // 2012-01-01T00:00:00Z
@@ -1007,57 +1034,54 @@ mod tests {
10071034 }
10081035
10091036 fn test_at_utc ( ) {
1010- os:: setenv( "TZ" , "America/Los_Angeles" ) ;
1011- tzset( ) ;
1037+ set_time_zone ( ) ;
10121038
10131039 let time = Timespec :: new ( 1234567890 , 54321 ) ;
10141040 let utc = at_utc ( time) ;
10151041
1016- assert ! ( utc. tm_sec == 30_i32 ) ;
1017- assert ! ( utc. tm_min == 31_i32 ) ;
1018- assert ! ( utc. tm_hour == 23_i32 ) ;
1019- assert ! ( utc. tm_mday == 13_i32 ) ;
1020- assert ! ( utc. tm_mon == 1_i32 ) ;
1021- assert ! ( utc. tm_year == 109_i32 ) ;
1022- assert ! ( utc. tm_wday == 5_i32 ) ;
1023- assert ! ( utc. tm_yday == 43_i32 ) ;
1024- assert ! ( utc. tm_isdst == 0_i32 ) ;
1025- assert ! ( utc. tm_gmtoff == 0_i32 ) ;
1026- assert ! ( utc. tm_zone == ~"UTC ");
1027- assert !(utc.tm_nsec == 54321_i32);
1042+ assert_eq ! ( utc. tm_sec, 30_i32 ) ;
1043+ assert_eq ! ( utc. tm_min, 31_i32 ) ;
1044+ assert_eq ! ( utc. tm_hour, 23_i32 ) ;
1045+ assert_eq ! ( utc. tm_mday, 13_i32 ) ;
1046+ assert_eq ! ( utc. tm_mon, 1_i32 ) ;
1047+ assert_eq ! ( utc. tm_year, 109_i32 ) ;
1048+ assert_eq ! ( utc. tm_wday, 5_i32 ) ;
1049+ assert_eq ! ( utc. tm_yday, 43_i32 ) ;
1050+ assert_eq ! ( utc. tm_isdst, 0_i32 ) ;
1051+ assert_eq ! ( utc. tm_gmtoff, 0_i32 ) ;
1052+ assert_eq ! ( utc. tm_zone, ~"UTC ");
1053+ assert_eq !(utc.tm_nsec, 54321_i32);
10281054 }
10291055
10301056 fn test_at() {
1031- os::setenv(" TZ ", " America /Los_Angeles ");
1032- tzset();
1057+ set_time_zone();
10331058
10341059 let time = Timespec::new(1234567890, 54321);
10351060 let local = at(time);
10361061
10371062 error!(" time_at: { : ?} ", local);
10381063
1039- assert !(local.tm_sec == 30_i32);
1040- assert !(local.tm_min == 31_i32);
1041- assert !(local.tm_hour == 15_i32);
1042- assert !(local.tm_mday == 13_i32);
1043- assert !(local.tm_mon == 1_i32);
1044- assert !(local.tm_year == 109_i32);
1045- assert !(local.tm_wday == 5_i32);
1046- assert !(local.tm_yday == 43_i32);
1047- assert !(local.tm_isdst == 0_i32);
1048- assert !(local.tm_gmtoff == -28800_i32);
1064+ assert_eq !(local.tm_sec, 30_i32);
1065+ assert_eq !(local.tm_min, 31_i32);
1066+ assert_eq !(local.tm_hour, 15_i32);
1067+ assert_eq !(local.tm_mday, 13_i32);
1068+ assert_eq !(local.tm_mon, 1_i32);
1069+ assert_eq !(local.tm_year, 109_i32);
1070+ assert_eq !(local.tm_wday, 5_i32);
1071+ assert_eq !(local.tm_yday, 43_i32);
1072+ assert_eq !(local.tm_isdst, 0_i32);
1073+ assert_eq !(local.tm_gmtoff, -28800_i32);
10491074
10501075 // FIXME (#2350): We should probably standardize on the timezone
10511076 // abbreviation.
10521077 let zone = &local.tm_zone;
10531078 assert!(*zone == ~" PST " || *zone == ~" Pacific Standard Time ");
10541079
1055- assert !(local.tm_nsec == 54321_i32);
1080+ assert_eq !(local.tm_nsec, 54321_i32);
10561081 }
10571082
10581083 fn test_to_timespec() {
1059- os::setenv(" TZ ", " America /Los_Angeles ");
1060- tzset();
1084+ set_time_zone();
10611085
10621086 let time = Timespec::new(1234567890, 54321);
10631087 let utc = at_utc(time);
@@ -1067,8 +1091,7 @@ mod tests {
10671091 }
10681092
10691093 fn test_conversions() {
1070- os::setenv(" TZ ", " America /Los_Angeles ");
1071- tzset();
1094+ set_time_zone();
10721095
10731096 let time = Timespec::new(1234567890, 54321);
10741097 let utc = at_utc(time);
@@ -1083,8 +1106,7 @@ mod tests {
10831106 }
10841107
10851108 fn test_strptime() {
1086- os::setenv(" TZ ", " America /Los_Angeles ");
1087- tzset();
1109+ set_time_zone();
10881110
10891111 match strptime(" ", " ") {
10901112 Ok(ref tm) => {
@@ -1248,8 +1270,7 @@ mod tests {
12481270 }
12491271
12501272 fn test_ctime() {
1251- os:: setenv( "TZ ", "America/Los_Angeles" ) ;
1252- tzset( ) ;
1273+ set_time_zone();
12531274
12541275 let time = Timespec::new(1234567890, 54321);
12551276 let utc = at_utc(time);
@@ -1262,8 +1283,7 @@ mod tests {
12621283 }
12631284
12641285 fn test_strftime() {
1265- os:: setenv( "TZ ", "America/Los_Angeles" ) ;
1266- tzset( ) ;
1286+ set_time_zone();
12671287
12681288 let time = Timespec::new(1234567890, 54321);
12691289 let utc = at_utc(time);
@@ -1323,8 +1343,7 @@ mod tests {
13231343 // abbreviation.
13241344 let rfc822 = local.rfc822();
13251345 let prefix = ~" Fri , 13 Feb 2009 15 : 31 : 30 ";
1326- assert!(rfc822 == prefix + "PST " ||
1327- rfc822 == prefix + "Pacific Standard Time" ) ;
1346+ assert!(rfc822 == prefix + " PST " || rfc822 == prefix + " Pacific Standard Time ");
13281347
13291348 assert_eq!(local.ctime(), ~" Fri Feb 13 15 : 31 : 30 2009 ");
13301349 assert_eq!(local.rfc822z(), ~" Fri , 13 Feb 2009 15 : 31 : 30 -0800 ");
0 commit comments