File tree 2 files changed +33
-6
lines changed
2 files changed +33
-6
lines changed Original file line number Diff line number Diff line change 500
500
REBINT i ;
501
501
REBINT n ;
502
502
REBI64 secs ;
503
- REBINT tz ;
503
+ REBINT tz , tzp ;
504
504
REBDAT date ;
505
505
REBINT day , month , year ;
506
506
REBINT num ;
525
525
case SYM_HOUR : i = 9 ; break ;
526
526
case SYM_MINUTE : i = 10 ; break ;
527
527
case SYM_SECOND : i = 11 ; break ;
528
+ case SYM_TIMEZONE : i = 12 ; break ;
528
529
default : return PE_BAD_SELECT ;
529
530
}
530
531
}
565
566
* val = * data ;
566
567
VAL_SET (val , REB_TIME );
567
568
return PE_USE ;
568
- case 4 :
569
+ case 4 : // zone
570
+ case 12 : // timezone
569
571
if (secs == NO_TIME ) return PE_NONE ;
570
572
* val = * data ;
571
573
VAL_TIME (val ) = (i64 )tz * ZONE_MINS * MIN_SEC ;
612
614
613
615
} else {
614
616
615
- if (IS_INTEGER (val ) || IS_DECIMAL (val )) n = Int32s (val , 0 );
617
+ if (IS_INTEGER (val ) || IS_DECIMAL (val )) {
618
+ // allow negative time zone
619
+ n = (i == 4 || i == 12 ) ? Int32 (val ) : Int32s (val , 0 );
620
+ }
616
621
else if (IS_NONE (val )) n = 0 ;
617
622
else if (IS_TIME (val ) && (i == 3 || i == 4 ));
618
623
else if (IS_DATE (val ) && (i == 3 || i == 5 ));
643
648
secs = DEC_TO_SECS (VAL_DECIMAL (val ));
644
649
else return PE_BAD_SET_TYPE ;
645
650
break ;
646
- case 4 :
647
- // zone
651
+ case 4 : // zone
652
+ case 12 : // timezone
653
+ tzp = tz ;
648
654
if (IS_TIME (val )) tz = (REBINT )(VAL_TIME (val ) / (ZONE_MINS * MIN_SEC ));
649
655
else if (IS_DATE (val )) tz = VAL_ZONE (val );
650
656
else tz = n * (60 / ZONE_MINS );
651
- if (tz > MAX_ZONE || tz < - MAX_ZONE ) return PE_BAD_RANGE ;
657
+ if (i == 4 && ( tz > MAX_ZONE || tz < - MAX_ZONE ) ) return PE_BAD_RANGE ;
652
658
if (secs == NO_TIME ) secs = 0 ;
659
+ if (i == 12 ) {
660
+ //Adjust_Date_Zone(val, FALSE);
661
+ secs += ((i64 )(tz - tzp ) * ((i64 )ZONE_SECS * SEC_SEC ));
662
+ }
653
663
break ;
654
664
case 5 :
655
665
// date
Original file line number Diff line number Diff line change @@ -91,5 +91,22 @@ Rebol [
91
91
92
92
===end-group===
93
93
94
+ ===start-group=== "DATE/TIMEZONE"
95
+ --test-- "set timezone"
96
+ ;@@ https://github.com/rebol/rebol-issues/issues/2370
97
+ d: 1-Jan-2000
98
+ d/zone: 2
99
+ --assert "1-Jan-2000/0:00+2:00" = mold d
100
+ d/timezone: 2
101
+ --assert "1-Jan-2000/0:00+2:00" = mold d
102
+ d/timezone: 4
103
+ --assert "1-Jan-2000/2:00+4:00" = mold d
104
+ d/timezone: -7
105
+ --assert "31-Dec-1999/15:00-7:00" = mold d
106
+ d/timezone: -70
107
+ --assert "29-Dec-1999/0:00-6:00" = mold d
108
+
109
+ ===end-group===
110
+
94
111
95
112
~~~end-file~~~
You can’t perform that action at this time.
0 commit comments