@@ -21,7 +21,7 @@ import { Exception, compareDates, DateTimeKind, IDateTime, IDateTimeOffset, padW
2121export 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
3232function 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+
7579export function fromTicks ( ticks : int64 , offset : number ) {
7680 const ms = ticksToUnixEpochMilliseconds ( ticks ) - offset ;
7781 return DateTimeOffset ( ms , offset ) ;
@@ -102,8 +106,8 @@ export function maxValue() {
102106export 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
153143export 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
159149export 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
168159export function toLocalTime ( date : IDateTimeOffset ) : Date {
169- return DateTime ( date . getTime ( ) + offset ( now ( ) ) , DateTimeKind . Local ) ;
160+ return DateTime ( date . getTime ( ) , DateTimeKind . Local ) ;
170161}
171162
172163export function localDateTime ( date : IDateTimeOffset ) : Date {
173164 return DateTime ( date . getTime ( ) , DateTimeKind . Local ) ;
174165}
175166
176167export 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
184175export 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
189180export 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
193184export 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
197188export 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
201192export 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
205196export 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
209200export 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
213204export 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
217208export 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
221212export 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
232223export 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
236227export function addDays ( d : IDateTimeOffset , v : number ) {
@@ -242,7 +233,7 @@ export function addHours(d: IDateTimeOffset, v: number) {
242233}
243234
244235export function addMinutes ( d : IDateTimeOffset , v : number ) {
245- return add ( d , v * 60000 ) ;
236+ return add ( d , v * 60_000 ) ;
246237}
247238
248239export 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
269260export 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
290281export 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
0 commit comments