Skip to content

Commit 478488b

Browse files
authored
[JS/TS] Fix fable-compiler#4240 Missing DateTime constructor (fable-compiler#4242)
1 parent b2133d3 commit 478488b

File tree

15 files changed

+235
-159
lines changed

15 files changed

+235
-159
lines changed

src/Fable.Cli/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1717

1818
### Fixed
1919

20+
* [JS/TS] Fix #4240 Missing DateTime constructor (by @ncave)
2021
* [PHP] Fix php import extensions (by @MangelMaxime)
2122
* [TS] Fix #3973 Typescript imports file extension (by @ncave)
2223
* [TS] Fix support for abstract classes and members (by @ncave)

src/Fable.Compiler/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1717

1818
### Fixed
1919

20+
* [JS/TS] Fix #4240 Missing DateTime constructor (by @ncave)
2021
* [PHP] Fix php import extensions (by @MangelMaxime)
2122
* [TS] Fix #3973 Typescript imports file extension (by @ncave)
2223
* [TS] Fix support for abstract classes and members (by @ncave)

src/Fable.Transforms/Replacements.fs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3113,6 +3113,9 @@ let dateTime (com: ICompiler) (ctx: Context) r t (i: CallInfo) (thisArg: Expr op
31133113
| ExprType(Number(Int64, _)) :: _ ->
31143114
Helper.LibCall(com, moduleName, "fromTicks", t, args, i.SignatureArgTypes, ?loc = r)
31153115
|> Some
3116+
| ExprType(DeclaredType(ent, [])) :: _ when ent.FullName = Types.dateOnly ->
3117+
Helper.LibCall(com, moduleName, "fromDateTime", t, args, i.SignatureArgTypes, ?loc = r)
3118+
|> Some
31163119
| _ ->
31173120
let last = List.last args
31183121

@@ -3167,6 +3170,9 @@ let dateTimeOffset (com: ICompiler) (ctx: Context) r t (i: CallInfo) (thisArg: E
31673170
| ExprType(DeclaredType(ent, [])) :: _ when ent.FullName = Types.datetime ->
31683171
Helper.LibCall(com, moduleName, "fromDate", t, args, i.SignatureArgTypes, ?loc = r)
31693172
|> Some
3173+
| ExprType(DeclaredType(ent, [])) :: _ when ent.FullName = Types.dateOnly ->
3174+
Helper.LibCall(com, moduleName, "fromDateTime", t, args, i.SignatureArgTypes, ?loc = r)
3175+
|> Some
31703176
| _ ->
31713177
match args.Length with
31723178
| 7

src/fable-library-ts/Date.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ function dateToStringWithCustomFormat(date: Date, format: string, utc: boolean)
200200
result += "Z";
201201
break;
202202
case DateTimeKind.Local:
203-
result += dateOffsetToString(localizedDate.getTimezoneOffset() * -60000);
203+
result += dateOffsetToString(localizedDate.getTimezoneOffset() * -60_000);
204204
break;
205205
case DateTimeKind.Unspecified:
206206
break;
@@ -293,10 +293,10 @@ function dateToStringWithCustomFormat(date: Date, format: string, utc: boolean)
293293
utcOffsetText = "+00:00";
294294
break;
295295
case DateTimeKind.Local:
296-
utcOffsetText = dateOffsetToString(localizedDate.getTimezoneOffset() * -60000);
296+
utcOffsetText = dateOffsetToString(localizedDate.getTimezoneOffset() * -60_000);
297297
break;
298298
case DateTimeKind.Unspecified:
299-
utcOffsetText = dateOffsetToString(toLocalTime(localizedDate).getTimezoneOffset() * -60000);
299+
utcOffsetText = dateOffsetToString(toLocalTime(localizedDate).getTimezoneOffset() * -60_000);
300300
break;
301301
}
302302

@@ -374,7 +374,7 @@ export function dateOffsetToString(offset: number) {
374374
const isMinus = offset < 0;
375375
offset = Math.abs(offset);
376376
const hours = ~~(offset / 3600000);
377-
const minutes = (offset % 3600000) / 60000;
377+
const minutes = (offset % 3600000) / 60_000;
378378
return (isMinus ? "-" : "+") +
379379
padWithZeros(hours, 2) + ":" +
380380
padWithZeros(minutes, 2);
@@ -393,7 +393,7 @@ function dateToISOString(d: IDateTime, utc: boolean) {
393393
padWithZeros(d.getMinutes(), 2) + ":" +
394394
padWithZeros(d.getSeconds(), 2) + "." +
395395
padWithZeros(d.getMilliseconds(), 3) +
396-
(printOffset ? dateOffsetToString(d.getTimezoneOffset() * -60000) : "");
396+
(printOffset ? dateOffsetToString(d.getTimezoneOffset() * -60_000) : "");
397397
}
398398
}
399399

@@ -490,6 +490,11 @@ export function fromTicks(ticks: number | bigint, kind?: DateTimeKind) {
490490
return date;
491491
}
492492

493+
export function fromDateTime(dateOnly: IDateTime, timeOnly: number, kind?: DateTimeKind) {
494+
const d = DateTime(dateOnly.getTime() + timeOnly, kind);
495+
return DateTime(d.getTime() - dateOffset(d), kind);
496+
}
497+
493498
export function fromDateTimeOffset(date: IDateTimeOffset, kind: DateTimeKind) {
494499
switch (kind) {
495500
case DateTimeKind.Utc: return DateTime(date.getTime(), DateTimeKind.Utc);
@@ -574,7 +579,7 @@ export function parseRaw(input: string): [Date, Offset] {
574579
}
575580
date = new Date(baseDate.getTime() + timeInSeconds * 1000);
576581
// correct for daylight savings time
577-
date = new Date(date.getTime() + (date.getTimezoneOffset() - baseDate.getTimezoneOffset()) * 60000);
582+
date = new Date(date.getTime() + (date.getTimezoneOffset() - baseDate.getTimezoneOffset()) * 60_000);
578583
} else {
579584
fail();
580585
}
@@ -664,7 +669,7 @@ export function specifyKind(d: IDateTime, kind: DateTimeKind) {
664669

665670
export function timeOfDay(d: IDateTime) {
666671
return hour(d) * 3600000
667-
+ minute(d) * 60000
672+
+ minute(d) * 60_000
668673
+ second(d) * 1000
669674
+ millisecond(d);
670675
}
@@ -721,7 +726,7 @@ export function add(d: IDateTime, ts: number) {
721726
const oldTzOffset = d.getTimezoneOffset();
722727
const newTzOffset = newDate.getTimezoneOffset();
723728
return oldTzOffset !== newTzOffset
724-
? DateTime(newDate.getTime() + (newTzOffset - oldTzOffset) * 60000, d.kind)
729+
? DateTime(newDate.getTime() + (newTzOffset - oldTzOffset) * 60_000, d.kind)
725730
: newDate;
726731
} else {
727732
return newDate;
@@ -737,7 +742,7 @@ export function addHours(d: IDateTime, v: number) {
737742
}
738743

739744
export function addMinutes(d: IDateTime, v: number) {
740-
return add(d, v * 60000);
745+
return add(d, v * 60_000);
741746
}
742747

743748
export function addSeconds(d: IDateTime, v: number) {

src/fable-library-ts/DateOffset.ts

Lines changed: 34 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { Exception, compareDates, DateTimeKind, IDateTime, IDateTimeOffset, padW
2121
export default function DateTimeOffset(value: number, offset?: number) {
2222
checkOffsetInRange(offset);
2323
const d = new Date(value) as IDateTimeOffset;
24-
d.offset = offset != null ? offset : new Date().getTimezoneOffset() * -60000;
24+
d.offset = offset != null ? offset : new Date().getTimezoneOffset() * -60_000;
2525
return d;
2626
}
2727

@@ -31,7 +31,7 @@ export function offset(value: IDateTimeOffset): number {
3131

3232
function checkOffsetInRange(offset?: number) {
3333
if (offset != null && offset !== 0) {
34-
if (offset % 60000 !== 0) {
34+
if (offset % 60_000 !== 0) {
3535
throw new Exception("Offset must be specified in whole minutes.");
3636
}
3737
if (Math.abs(offset / 3600000) > 14) {
@@ -72,6 +72,10 @@ export function fromDate(date: IDateTime, offset?: number) {
7272
return DateTimeOffset(date.getTime(), offset2);
7373
}
7474

75+
export function fromDateTime(dateOnly: IDateTime, timeOnly: number, offset: number) {
76+
return DateTimeOffset(dateOnly.getTime() - offset + timeOnly, offset);
77+
}
78+
7579
export function fromTicks(ticks: int64, offset: number) {
7680
const ms = ticksToUnixEpochMilliseconds(ticks) - offset;
7781
return DateTimeOffset(ms, offset);
@@ -102,8 +106,8 @@ export function maxValue() {
102106
export function parse(str: string): IDateTimeOffset {
103107
const [date, offsetMatch] = parseRaw(str);
104108
const offset = offsetMatch == null
105-
? date.getTimezoneOffset() * -60000
106-
: (offsetMatch === "Z" ? 0 : offsetMatch * 60000);
109+
? date.getTimezoneOffset() * -60_000
110+
: (offsetMatch === "Z" ? 0 : offsetMatch * 60_000);
107111
return DateTimeOffset(date.getTime(), offset);
108112
}
109113

@@ -125,23 +129,9 @@ export function create(
125129
ms = 0;
126130
}
127131
checkOffsetInRange(offset);
128-
let date: Date;
129-
if (offset === 0) {
130-
date = new Date(Date.UTC(year, month - 1, day, h, m, s, ms));
131-
if (year <= 99) {
132-
date.setUTCFullYear(year, month - 1, day);
133-
}
134-
} else {
135-
const str =
136-
padWithZeros(year, 4) + "-" +
137-
padWithZeros(month, 2) + "-" +
138-
padWithZeros(day, 2) + "T" +
139-
padWithZeros(h, 2) + ":" +
140-
padWithZeros(m, 2) + ":" +
141-
padWithZeros(s, 2) + "." +
142-
padWithZeros(ms, 3) +
143-
dateOffsetToString(offset);
144-
date = new Date(str);
132+
let date = new Date(Date.UTC(year, month - 1, day, h, m, s, ms) - offset);
133+
if (year <= 99) {
134+
date.setUTCFullYear(year, month - 1, day);
145135
}
146136
const dateValue = date.getTime();
147137
if (isNaN(dateValue)) {
@@ -152,12 +142,13 @@ export function create(
152142

153143
export function now() {
154144
const date = new Date();
155-
const offset = date.getTimezoneOffset() * -60000;
156-
return DateTimeOffset(date.getTime(), offset);
145+
const offset = date.getTimezoneOffset() * -60_000;
146+
return DateTimeOffset(date.getTime() - offset, offset);
157147
}
158148

159149
export function utcNow() {
160-
const date = now();
150+
const date = new Date();
151+
// const offset = date.getTimezoneOffset() * -60_000;
161152
return DateTimeOffset(date.getTime(), 0);
162153
}
163154

@@ -166,60 +157,60 @@ export function toUniversalTime(date: IDateTimeOffset): Date {
166157
}
167158

168159
export function toLocalTime(date: IDateTimeOffset): Date {
169-
return DateTime(date.getTime() + offset(now()), DateTimeKind.Local);
160+
return DateTime(date.getTime(), DateTimeKind.Local);
170161
}
171162

172163
export function localDateTime(date: IDateTimeOffset) : Date {
173164
return DateTime(date.getTime(), DateTimeKind.Local);
174165
}
175166

176167
export function timeOfDay(d: IDateTimeOffset) {
177-
const d2 = new Date(d.getTime() + (d.offset ?? 0));
168+
const d2 = new Date(d.getTime() + offset(d));
178169
return d2.getUTCHours() * 3600000
179-
+ d2.getUTCMinutes() * 60000
170+
+ d2.getUTCMinutes() * 60_000
180171
+ d2.getUTCSeconds() * 1000
181172
+ d2.getUTCMilliseconds();
182173
}
183174

184175
export function date(d: IDateTimeOffset) {
185-
const d2 = new Date(d.getTime() + (d.offset ?? 0));
176+
const d2 = new Date(d.getTime() + offset(d));
186177
return createDate(d2.getUTCFullYear(), d2.getUTCMonth() + 1, d2.getUTCDate(), 0, 0, 0, 0);
187178
}
188179

189180
export function day(d: IDateTimeOffset) {
190-
return new Date(d.getTime() + (d.offset ?? 0)).getUTCDate();
181+
return new Date(d.getTime() + offset(d)).getUTCDate();
191182
}
192183

193184
export function hour(d: IDateTimeOffset) {
194-
return new Date(d.getTime() + (d.offset ?? 0)).getUTCHours();
185+
return new Date(d.getTime() + offset(d)).getUTCHours();
195186
}
196187

197188
export function millisecond(d: IDateTimeOffset) {
198-
return new Date(d.getTime() + (d.offset ?? 0)).getUTCMilliseconds();
189+
return new Date(d.getTime() + offset(d)).getUTCMilliseconds();
199190
}
200191

201192
export function minute(d: IDateTimeOffset) {
202-
return new Date(d.getTime() + (d.offset ?? 0)).getUTCMinutes();
193+
return new Date(d.getTime() + offset(d)).getUTCMinutes();
203194
}
204195

205196
export function month(d: IDateTimeOffset) {
206-
return new Date(d.getTime() + (d.offset ?? 0)).getUTCMonth() + 1;
197+
return new Date(d.getTime() + offset(d)).getUTCMonth() + 1;
207198
}
208199

209200
export function second(d: IDateTimeOffset) {
210-
return new Date(d.getTime() + (d.offset ?? 0)).getUTCSeconds();
201+
return new Date(d.getTime() + offset(d)).getUTCSeconds();
211202
}
212203

213204
export function year(d: IDateTimeOffset) {
214-
return new Date(d.getTime() + (d.offset ?? 0)).getUTCFullYear();
205+
return new Date(d.getTime() + offset(d)).getUTCFullYear();
215206
}
216207

217208
export function dayOfWeek(d: IDateTimeOffset) {
218-
return new Date(d.getTime() + (d.offset ?? 0)).getUTCDay();
209+
return new Date(d.getTime() + offset(d)).getUTCDay();
219210
}
220211

221212
export function dayOfYear(d: IDateTimeOffset) {
222-
const d2 = new Date(d.getTime() + (d.offset ?? 0));
213+
const d2 = new Date(d.getTime() + offset(d));
223214
const _year = d2.getUTCFullYear();
224215
const _month = d2.getUTCMonth() + 1;
225216
let _day = d2.getUTCDate();
@@ -230,7 +221,7 @@ export function dayOfYear(d: IDateTimeOffset) {
230221
}
231222

232223
export function add(d: IDateTimeOffset, ts: number) {
233-
return DateTimeOffset(d.getTime() + ts, (d.offset ?? 0));
224+
return DateTimeOffset(d.getTime() + ts, offset(d));
234225
}
235226

236227
export function addDays(d: IDateTimeOffset, v: number) {
@@ -242,7 +233,7 @@ export function addHours(d: IDateTimeOffset, v: number) {
242233
}
243234

244235
export function addMinutes(d: IDateTimeOffset, v: number) {
245-
return add(d, v * 60000);
236+
return add(d, v * 60_000);
246237
}
247238

248239
export function addSeconds(d: IDateTimeOffset, v: number) {
@@ -263,11 +254,11 @@ export function addYears(d: IDateTimeOffset, v: number) {
263254
const _daysInMonth = daysInMonth(newYear, newMonth);
264255
const newDay = Math.min(_daysInMonth, d.getUTCDate());
265256
return create(newYear, newMonth, newDay, d.getUTCHours(), d.getUTCMinutes(),
266-
d.getUTCSeconds(), d.getUTCMilliseconds(), (d.offset ?? 0));
257+
d.getUTCSeconds(), d.getUTCMilliseconds(), offset(d));
267258
}
268259

269260
export function addMonths(d: IDateTimeOffset, v: number) {
270-
const d2 = new Date(d.getTime() + (d.offset ?? 0));
261+
const d2 = new Date(d.getTime() + offset(d));
271262
let newMonth = d2.getUTCMonth() + 1 + v;
272263
let newMonth_ = 0;
273264
let yearOffset = 0;
@@ -284,12 +275,12 @@ export function addMonths(d: IDateTimeOffset, v: number) {
284275
const _daysInMonth = daysInMonth(newYear, newMonth);
285276
const newDay = Math.min(_daysInMonth, d2.getUTCDate());
286277
return create(newYear, newMonth, newDay, d2.getUTCHours(), d2.getUTCMinutes(),
287-
d2.getUTCSeconds(), d2.getUTCMilliseconds(), (d.offset ?? 0));
278+
d2.getUTCSeconds(), d2.getUTCMilliseconds(), offset(d));
288279
}
289280

290281
export function subtract<Input extends number | IDateTimeOffset, Output = Input extends number ? IDateTimeOffset : number>(d: IDateTimeOffset, that: Input): Output {
291282
return typeof that === "number"
292-
? DateTimeOffset(d.getTime() - that, (d.offset ?? 0)) as Output
283+
? DateTimeOffset(d.getTime() - that, offset(d)) as Output
293284
: d.getTime() - that.getTime() as Output;
294285
}
295286

src/fable-library-ts/DateOnly.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export function dayOfYear(d: IDateTime) {
5858
}
5959

6060
export function toDateTime(d: IDateTime, time: number, kind: DateTimeKind = DateTimeKind.Unspecified) {
61-
return DateTime(d.getTime() + time + (kind !== DateTimeKind.Utc ? d.getTimezoneOffset() : 0) * 60000, kind);
61+
return DateTime(d.getTime() + time + (kind !== DateTimeKind.Utc ? d.getTimezoneOffset() : 0) * 60_000, kind);
6262
}
6363

6464
export function toString(d: IDateTime, format = "d", _provider?: any) {

src/fable-library-ts/TimeOnly.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export function create(h: number = 0, m: number = 0, s: number = 0, ms: number =
88
if (h < 0 || m < 0 || s < 0 || ms < 0)
99
throw new Exception("The parameters describe an unrepresentable TimeOnly.");
1010

11-
return h * 3600000 + m * 60000 + s * 1000 + ms;
11+
return h * 3600000 + m * 60_000 + s * 1000 + ms;
1212
}
1313

1414
export function fromTicks(ticks: number | bigint) {
@@ -61,7 +61,7 @@ export function addHours(t: number, h: number) {
6161
}
6262

6363
export function addMinutes(t: number, m: number) {
64-
return add(t, m * 60000);
64+
return add(t, m * 60_000);
6565
}
6666

6767
export function isBetween(t: number, start: number, end: number) {

src/fable-library-ts/TimeSpan.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export function create(d: number = 0, h: number = 0, m: number = 0, s: number =
2828
// d,h,m,s,ms
2929
break;
3030
}
31-
return d * 86400000 + h * 3600000 + m * 60000 + s * 1000 + ms;
31+
return d * 86400000 + h * 3600000 + m * 60_000 + s * 1000 + ms;
3232
}
3333

3434
export function fromTicks(ticks: number | bigint) {
@@ -64,11 +64,11 @@ export function hours(ts: TimeSpan) {
6464
}
6565

6666
export function minutes(ts: TimeSpan) {
67-
return signedRound(ts % 3600000 / 60000);
67+
return signedRound(ts % 3600000 / 60_000);
6868
}
6969

7070
export function seconds(ts: TimeSpan) {
71-
return signedRound(ts % 60000 / 1000);
71+
return signedRound(ts % 60_000 / 1000);
7272
}
7373

7474
export function milliseconds(ts: TimeSpan) {
@@ -88,7 +88,7 @@ export function totalHours(ts: TimeSpan) {
8888
}
8989

9090
export function totalMinutes(ts: TimeSpan) {
91-
return ts / 60000;
91+
return ts / 60_000;
9292
}
9393

9494
export function totalSeconds(ts: TimeSpan) {

src/fable-library-ts/Util.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ export function dateOffset(date: IDateTime | IDateTimeOffset): number {
341341
return typeof date1.offset === "number"
342342
? date1.offset
343343
: ((date as IDateTime).kind === DateTimeKind.Utc
344-
? 0 : date.getTimezoneOffset() * -60000);
344+
? 0 : date.getTimezoneOffset() * -60_000);
345345
}
346346

347347
export function int16ToString(i: number, radix?: number) {

0 commit comments

Comments
 (0)