Skip to content

Commit b6aedca

Browse files
committed
FEAT: direct conversion between date and decimal now uses Modified Julian Date
related to: Oldes/Rebol-issues#2551
1 parent 483db91 commit b6aedca

File tree

4 files changed

+43
-39
lines changed

4 files changed

+43
-39
lines changed

src/core/t-date.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1015,7 +1015,7 @@ static const REBI64 DAYS_OF_JAN_1ST_1970 = 719468; // number of days for 1st Jan
10151015
return R_RET;
10161016
}
10171017
else if (IS_DECIMAL(arg)) {
1018-
Julian_To_Gregorian_Date(VAL_DECIMAL(arg), &day, &month, &year, &secs);
1018+
Julian_To_Gregorian_Date(VAL_DECIMAL(arg) + 2400000.5, &day, &month, &year, &secs);
10191019
day--; month--; // The date/time normalization expects 0-based day and month
10201020
goto fixTime;
10211021
}

src/core/t-decimal.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ REBOOL almost_equal(REBDEC a, REBDEC b, REBCNT max_diff) {
413413
if (VAL_TIME(val) != NO_TIME) {
414414
Split_Time(VAL_TIME(val), &time);
415415
}
416-
d1 = Gregorian_To_Julian_Date(VAL_DATE(val), time);
416+
d1 = Gregorian_To_Julian_Date(VAL_DATE(val), time) - 2400000.5;
417417
break;
418418
}
419419

src/tests/units/date-test.r3

+1-1
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ Rebol [
339339
;@@ https://github.com/Oldes/Rebol-issues/issues/2551
340340
--test-- "Julian accessor"
341341
date: 10-Jun-2023/20:47:53+2:00
342-
--assert date/julian = to decimal! date
342+
--assert date/julian = (2400000.5 + to decimal! date) ;; conversion using TO counts with Modified Julian Date
343343
--assert 2460106.28325231 = date/julian
344344
--assert 2460106.28325231 = pick date 'julian
345345
--test-- "Julian date setter"

src/tests/units/make-test.r3

+40-36
Original file line numberDiff line numberDiff line change
@@ -63,24 +63,26 @@ Rebol [
6363
--assert 20-Sep-2021/10:58:32 = to date! 1632135512
6464
--test-- "make/to date! decimal!"
6565
;@@ https://github.com/Oldes/Rebol-issues/issues/2551
66-
--assert 01-Jan-1900/00:00:00 = make date! 2415020.5
67-
--assert 01-Jan-1900/00:00:00 = to date! 2415020.5
68-
--assert 02-May-2003/12:00:00 = make date! 2452762.0
69-
--assert 02-May-2003/12:00:00 = to date! 2452762.0
70-
--assert 10-Jun-2023/01:30:00 = make date! 2460105.5625
71-
--assert 10-Jun-2023/01:30:00 = to date! 2460105.5625
72-
--assert 10-Jun-2023/19:30:00 = make date! 2460106.3125
73-
--assert 10-Jun-2023/19:30:00 = to date! 2460106.3125
74-
--assert 01-Jan-2023/12:00:00 = make date! 2459946.0
75-
--assert 01-Jan-2023/12:00:00 = to date! 2459946.0
76-
--assert 01-Jan-2023/19:30:00 = make date! 2459946.3125
77-
--assert 01-Jan-2023/19:30:00 = to date! 2459946.3125
78-
--assert 01-Jan-2023/01:00:00 = make date! 2459945.54166667
79-
--assert 01-Jan-2023/01:00:00 = to date! 2459945.54166667
80-
--assert 31-Aug-2132/00:00:00 = make date! 2499999.5
81-
--assert 31-Aug-2132/00:00:00 = to date! 2499999.5
82-
--assert 01-Sep-2132/00:00:00 = make date! 2500000.5
83-
--assert 01-Sep-2132/00:00:00 = to date! 2500000.5
66+
--assert 17-Nov-1858/00:00:00 = make date! 0.0
67+
--assert 17-Nov-1858/00:00:00 = to date! 0.0
68+
--assert 01-Jan-1900/00:00:00 = make date! 15020.0
69+
--assert 01-Jan-1900/00:00:00 = to date! 15020.0
70+
--assert 02-May-2003/12:00:00 = make date! 52761.5
71+
--assert 02-May-2003/12:00:00 = to date! 52761.5
72+
--assert 10-Jun-2023/01:30:00 = make date! 60105.0625
73+
--assert 10-Jun-2023/01:30:00 = to date! 60105.0625
74+
--assert 10-Jun-2023/19:30:00 = make date! 60105.8125
75+
--assert 10-Jun-2023/19:30:00 = to date! 60105.8125
76+
--assert 01-Jan-2023/12:00:00 = make date! 59945.5
77+
--assert 01-Jan-2023/12:00:00 = to date! 59945.5
78+
--assert 01-Jan-2023/19:30:00 = make date! 59945.8125
79+
--assert 01-Jan-2023/19:30:00 = to date! 59945.8125
80+
--assert 01-Jan-2023/01:30:00 = make date! 59945.0625
81+
--assert 01-Jan-2023/01:30:00 = to date! 59945.0625
82+
--assert 31-Aug-2132/00:00:00 = make date! 99999.0
83+
--assert 31-Aug-2132/00:00:00 = to date! 99999.0
84+
--assert 01-Sep-2132/00:00:00 = make date! 100000.0
85+
--assert 01-Sep-2132/00:00:00 = to date! 100000.0
8486
===end-group===
8587

8688
===start-group=== "make/to integer"
@@ -164,24 +166,26 @@ Rebol [
164166

165167
--test-- "make/to decimal! date!"
166168
;@@ https://github.com/Oldes/Rebol-issues/issues/2551
167-
--assert 2415020.5 = make decimal! 01-Jan-1900/00:00:00
168-
--assert 2415020.5 = to decimal! 01-Jan-1900/00:00:00
169-
--assert 2452762.0 = make decimal! 02-May-2003/12:00:00
170-
--assert 2452762.0 = to decimal! 02-May-2003/12:00:00
171-
--assert 2460105.5625 = make decimal! 10-Jun-2023/01:30:00
172-
--assert 2460105.5625 = to decimal! 10-Jun-2023/01:30:00
173-
--assert 2460106.3125 = make decimal! 10-Jun-2023/19:30:00
174-
--assert 2460106.3125 = to decimal! 10-Jun-2023/19:30:00
175-
--assert 2459946.0 = make decimal! 01-Jan-2023/12:00:00
176-
--assert 2459946.0 = to decimal! 01-Jan-2023/12:00:00
177-
--assert 2459946.3125 = make decimal! 01-Jan-2023/19:30:00
178-
--assert 2459946.3125 = to decimal! 01-Jan-2023/19:30:00
179-
--assert 2459945.54166667 = make decimal! 01-Jan-2023/01:00:00
180-
--assert 2459945.54166667 = to decimal! 01-Jan-2023/01:00:00
181-
--assert 2499999.5 = make decimal! 31-Aug-2132/00:00:00
182-
--assert 2499999.5 = to decimal! 31-Aug-2132/00:00:00
183-
--assert 2500000.5 = make decimal! 01-Sep-2132/00:00:00
184-
--assert 2500000.5 = to decimal! 01-Sep-2132/00:00:00
169+
--assert 0.0 = make decimal! 17-Nov-1858/00:00:00
170+
--assert 0.0 = to decimal! 17-Nov-1858/00:00:00
171+
--assert 15020.0 = make decimal! 01-Jan-1900/00:00:00
172+
--assert 15020.0 = to decimal! 01-Jan-1900/00:00:00
173+
--assert 52761.5 = make decimal! 02-May-2003/12:00:00
174+
--assert 52761.5 = to decimal! 02-May-2003/12:00:00
175+
--assert 60105.0625 = make decimal! 10-Jun-2023/01:30:00
176+
--assert 60105.0625 = to decimal! 10-Jun-2023/01:30:00
177+
--assert 60105.8125 = make decimal! 10-Jun-2023/19:30:00
178+
--assert 60105.8125 = to decimal! 10-Jun-2023/19:30:00
179+
--assert 59945.5 = make decimal! 01-Jan-2023/12:00:00
180+
--assert 59945.5 = to decimal! 01-Jan-2023/12:00:00
181+
--assert 59945.8125 = make decimal! 01-Jan-2023/19:30:00
182+
--assert 59945.8125 = to decimal! 01-Jan-2023/19:30:00
183+
--assert 59945.0625 = make decimal! 01-Jan-2023/01:30:00
184+
--assert 59945.0625 = to decimal! 01-Jan-2023/01:30:00
185+
--assert 99999.0 = make decimal! 31-Aug-2132/00:00:00
186+
--assert 99999.0 = to decimal! 31-Aug-2132/00:00:00
187+
--assert 100000.0 = make decimal! 01-Sep-2132/00:00:00
188+
--assert 100000.0 = to decimal! 01-Sep-2132/00:00:00
185189
===end-group===
186190

187191

0 commit comments

Comments
 (0)