Skip to content

Commit 119ed54

Browse files
authored
Date picker: fix time zone issues (#737)
1 parent 3b5399c commit 119ed54

File tree

5 files changed

+68
-58
lines changed

5 files changed

+68
-58
lines changed

CHANGELOG.md

+8
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
# 2.68.3 (2025-03-04)
2+
3+
### Bug fix
4+
5+
- **Date picker**:
6+
- Dates are now set to 00:00:00 in the user's local time zone instead of UTC
7+
- Dates are no longer miscalculated for users in time zones with a negative offset
8+
19
# 2.68.2 (2025-02-10)
210

311
### Bug fix

projects/pastanaga-angular/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@guillotinaweb/pastanaga-angular",
33
"description": "Provides Pastanaga UI elements as Angular components",
4-
"version": "2.68.2",
4+
"version": "2.68.3",
55
"license": "MIT",
66
"keywords": [
77
"angular",

projects/pastanaga-angular/src/lib/date-picker/__snapshots__/date-picker.component.spec.ts.snap

+55-43
Original file line numberDiff line numberDiff line change
@@ -525,255 +525,267 @@ exports[`DatePickerComponent should generate weeks 1`] = `
525525
[
526526
[
527527
{
528-
"date": 2022-06-27T00:00:00.000Z,
528+
"date": 2022-06-26T04:00:00.000Z,
529529
"number": 26,
530530
"otherMonth": true,
531531
"selected": false,
532532
},
533533
{
534-
"date": 2022-06-28T00:00:00.000Z,
534+
"date": 2022-06-27T04:00:00.000Z,
535535
"number": 27,
536536
"otherMonth": true,
537537
"selected": false,
538538
},
539539
{
540-
"date": 2022-06-29T00:00:00.000Z,
540+
"date": 2022-06-28T04:00:00.000Z,
541541
"number": 28,
542542
"otherMonth": true,
543543
"selected": false,
544544
},
545545
{
546-
"date": 2022-06-30T00:00:00.000Z,
546+
"date": 2022-06-29T04:00:00.000Z,
547547
"number": 29,
548548
"otherMonth": true,
549549
"selected": false,
550550
},
551551
{
552-
"date": 2022-07-01T00:00:00.000Z,
552+
"date": 2022-06-30T04:00:00.000Z,
553553
"number": 30,
554-
"otherMonth": false,
554+
"otherMonth": true,
555555
"selected": false,
556556
},
557557
{
558-
"date": 2022-07-02T00:00:00.000Z,
558+
"date": 2022-07-01T04:00:00.000Z,
559559
"number": 1,
560560
"otherMonth": false,
561561
"selected": false,
562562
},
563563
{
564-
"date": 2022-07-03T00:00:00.000Z,
564+
"date": 2022-07-02T04:00:00.000Z,
565565
"number": 2,
566566
"otherMonth": false,
567567
"selected": false,
568568
},
569569
],
570570
[
571571
{
572-
"date": 2022-07-04T00:00:00.000Z,
572+
"date": 2022-07-03T04:00:00.000Z,
573573
"number": 3,
574574
"otherMonth": false,
575575
"selected": false,
576576
},
577577
{
578-
"date": 2022-07-05T00:00:00.000Z,
578+
"date": 2022-07-04T04:00:00.000Z,
579579
"number": 4,
580580
"otherMonth": false,
581581
"selected": false,
582582
},
583583
{
584-
"date": 2022-07-06T00:00:00.000Z,
584+
"date": 2022-07-05T04:00:00.000Z,
585585
"number": 5,
586586
"otherMonth": false,
587587
"selected": false,
588588
},
589589
{
590-
"date": 2022-07-07T00:00:00.000Z,
590+
"date": 2022-07-06T04:00:00.000Z,
591591
"number": 6,
592592
"otherMonth": false,
593593
"selected": false,
594594
},
595595
{
596-
"date": 2022-07-08T00:00:00.000Z,
596+
"date": 2022-07-07T04:00:00.000Z,
597597
"number": 7,
598598
"otherMonth": false,
599599
"selected": false,
600600
},
601601
{
602-
"date": 2022-07-09T00:00:00.000Z,
602+
"date": 2022-07-08T04:00:00.000Z,
603603
"number": 8,
604604
"otherMonth": false,
605605
"selected": false,
606606
},
607607
{
608-
"date": 2022-07-10T00:00:00.000Z,
608+
"date": 2022-07-09T04:00:00.000Z,
609609
"number": 9,
610610
"otherMonth": false,
611611
"selected": false,
612612
},
613613
],
614614
[
615615
{
616-
"date": 2022-07-11T00:00:00.000Z,
616+
"date": 2022-07-10T04:00:00.000Z,
617617
"number": 10,
618618
"otherMonth": false,
619619
"selected": false,
620620
},
621621
{
622-
"date": 2022-07-12T00:00:00.000Z,
622+
"date": 2022-07-11T04:00:00.000Z,
623623
"number": 11,
624624
"otherMonth": false,
625625
"selected": false,
626626
},
627627
{
628-
"date": 2022-07-13T00:00:00.000Z,
628+
"date": 2022-07-12T04:00:00.000Z,
629629
"number": 12,
630630
"otherMonth": false,
631631
"selected": false,
632632
},
633633
{
634-
"date": 2022-07-14T00:00:00.000Z,
634+
"date": 2022-07-13T04:00:00.000Z,
635635
"number": 13,
636636
"otherMonth": false,
637637
"selected": false,
638638
},
639639
{
640-
"date": 2022-07-15T00:00:00.000Z,
640+
"date": 2022-07-14T04:00:00.000Z,
641641
"number": 14,
642642
"otherMonth": false,
643643
"selected": false,
644644
},
645645
{
646-
"date": 2022-07-16T00:00:00.000Z,
646+
"date": 2022-07-15T04:00:00.000Z,
647647
"number": 15,
648648
"otherMonth": false,
649649
"selected": false,
650650
},
651651
{
652-
"date": 2022-07-17T00:00:00.000Z,
652+
"date": 2022-07-16T04:00:00.000Z,
653653
"number": 16,
654654
"otherMonth": false,
655655
"selected": false,
656656
},
657657
],
658658
[
659659
{
660-
"date": 2022-07-18T00:00:00.000Z,
660+
"date": 2022-07-17T04:00:00.000Z,
661661
"number": 17,
662662
"otherMonth": false,
663663
"selected": false,
664664
},
665665
{
666-
"date": 2022-07-19T00:00:00.000Z,
666+
"date": 2022-07-18T04:00:00.000Z,
667667
"number": 18,
668668
"otherMonth": false,
669669
"selected": false,
670670
},
671671
{
672-
"date": 2022-07-20T00:00:00.000Z,
672+
"date": 2022-07-19T04:00:00.000Z,
673673
"number": 19,
674674
"otherMonth": false,
675675
"selected": false,
676676
},
677677
{
678-
"date": 2022-07-21T00:00:00.000Z,
678+
"date": 2022-07-20T04:00:00.000Z,
679679
"number": 20,
680680
"otherMonth": false,
681681
"selected": false,
682682
},
683683
{
684-
"date": 2022-07-22T00:00:00.000Z,
684+
"date": 2022-07-21T04:00:00.000Z,
685685
"number": 21,
686686
"otherMonth": false,
687687
"selected": false,
688688
},
689689
{
690-
"date": 2022-07-23T00:00:00.000Z,
690+
"date": 2022-07-22T04:00:00.000Z,
691691
"number": 22,
692692
"otherMonth": false,
693693
"selected": false,
694694
},
695695
{
696-
"date": 2022-07-24T00:00:00.000Z,
696+
"date": 2022-07-23T04:00:00.000Z,
697697
"number": 23,
698698
"otherMonth": false,
699699
"selected": false,
700700
},
701701
],
702702
[
703703
{
704-
"date": 2022-07-25T00:00:00.000Z,
704+
"date": 2022-07-24T04:00:00.000Z,
705705
"number": 24,
706706
"otherMonth": false,
707707
"selected": false,
708708
},
709709
{
710-
"date": 2022-07-26T00:00:00.000Z,
710+
"date": 2022-07-25T04:00:00.000Z,
711711
"number": 25,
712712
"otherMonth": false,
713713
"selected": false,
714714
},
715715
{
716-
"date": 2022-07-27T00:00:00.000Z,
716+
"date": 2022-07-26T04:00:00.000Z,
717717
"number": 26,
718718
"otherMonth": false,
719719
"selected": false,
720720
},
721721
{
722-
"date": 2022-07-28T00:00:00.000Z,
722+
"date": 2022-07-27T04:00:00.000Z,
723723
"number": 27,
724724
"otherMonth": false,
725725
"selected": false,
726726
},
727727
{
728-
"date": 2022-07-29T00:00:00.000Z,
728+
"date": 2022-07-28T04:00:00.000Z,
729729
"number": 28,
730730
"otherMonth": false,
731731
"selected": false,
732732
},
733733
{
734-
"date": 2022-07-30T00:00:00.000Z,
734+
"date": 2022-07-29T04:00:00.000Z,
735735
"number": 29,
736736
"otherMonth": false,
737737
"selected": false,
738738
},
739739
{
740-
"date": 2022-07-31T00:00:00.000Z,
740+
"date": 2022-07-30T04:00:00.000Z,
741741
"number": 30,
742-
"otherMonth": true,
742+
"otherMonth": false,
743743
"selected": false,
744744
},
745745
],
746746
[
747747
{
748-
"date": 2022-08-01T00:00:00.000Z,
748+
"date": 2022-07-31T04:00:00.000Z,
749749
"number": 31,
750-
"otherMonth": true,
750+
"otherMonth": false,
751751
"selected": false,
752752
},
753753
{
754-
"date": 2022-08-02T00:00:00.000Z,
754+
"date": 2022-08-01T04:00:00.000Z,
755755
"number": 1,
756756
"otherMonth": true,
757757
"selected": false,
758758
},
759759
{
760-
"date": 2022-08-03T00:00:00.000Z,
760+
"date": 2022-08-02T04:00:00.000Z,
761761
"number": 2,
762762
"otherMonth": true,
763763
"selected": false,
764764
},
765765
{
766-
"date": 2022-08-04T00:00:00.000Z,
766+
"date": 2022-08-03T04:00:00.000Z,
767767
"number": 3,
768768
"otherMonth": true,
769769
"selected": false,
770770
},
771771
{
772-
"date": 2022-08-05T00:00:00.000Z,
772+
"date": 2022-08-04T04:00:00.000Z,
773773
"number": 4,
774774
"otherMonth": true,
775775
"selected": false,
776776
},
777+
{
778+
"date": 2022-08-05T04:00:00.000Z,
779+
"number": 5,
780+
"otherMonth": true,
781+
"selected": false,
782+
},
783+
{
784+
"date": 2022-08-06T04:00:00.000Z,
785+
"number": 6,
786+
"otherMonth": true,
787+
"selected": false,
788+
},
777789
],
778790
]
779791
`;

projects/pastanaga-angular/src/lib/date-picker/date-picker.component.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ describe('DatePickerComponent', () => {
130130
it('should update with date', () => {
131131
// === Setup ===
132132
const value = 'March 22, 2022';
133-
const expected = new Date('2022-03-22T00:00:00.000Z');
133+
const expected = new Date('2022-03-22T00:00:00.000');
134134

135135
// === Execute ===
136136
component.inputControl.setValue(value);

projects/pastanaga-angular/src/lib/date-picker/date-picker.component.ts

+3-13
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import {
1313
} from '@angular/core';
1414
import {
1515
add,
16-
addMinutes,
1716
addMonths,
1817
getDate,
1918
getDay,
@@ -137,7 +136,7 @@ export class DatePickerComponent extends PaFormControlDirective {
137136
const date = formatDate(value, 'longDate', this.locale);
138137

139138
this.inputControl.setValue(date);
140-
this._selectedDate = this.getUtcDate(startOfDay(new Date(value)));
139+
this._selectedDate = startOfDay(new Date(value));
141140
this.trackedDate = this._selectedDate || new Date();
142141
});
143142

@@ -160,7 +159,7 @@ export class DatePickerComponent extends PaFormControlDirective {
160159
}
161160
} else if (value) {
162161
// this maintains the user's format for now
163-
date = this.getUtcDate(parse(value, format, this.trackedDate));
162+
date = parse(value, format, this.trackedDate);
164163
}
165164
return date;
166165
}),
@@ -178,7 +177,7 @@ export class DatePickerComponent extends PaFormControlDirective {
178177
private generateWeeks(): void {
179178
this.weeks = [];
180179

181-
const monthStartDate = this.getUtcDate(startOfDay(set(this.trackedDate, { date: 1 }))) as Date;
180+
const monthStartDate = startOfDay(set(this.trackedDate, { date: 1 }));
182181
const monthFirstDay = getDay(monthStartDate);
183182
const monthLastDay = getDay(lastDayOfMonth(this.trackedDate));
184183
const monthNumDays = getDaysInMonth(monthStartDate);
@@ -306,15 +305,6 @@ export class DatePickerComponent extends PaFormControlDirective {
306305
this.onChange(this._selectedDate?.toISOString());
307306
}
308307

309-
/**
310-
* date is corresponding to the start of the day in the current local, like 2023-06-02T00:00:00.000 GMT+0200
311-
* If we keep it like this, date.toISOString() returns 2023-06-01T22:00:00.000Z (toISOString always converting the date provided date to UTC)
312-
* So we add the timezone offset to the date: that way this._selectedDate.toISOString() will return 2023-06-02T00:00:00.000Z as expected
313-
*/
314-
private getUtcDate(date: Date | undefined) {
315-
return date && addMinutes(date, date.getTimezoneOffset() * -1);
316-
}
317-
318308
override setDisabledState(isDisabled: boolean) {
319309
if (isDisabled === this.inputControl.disabled) {
320310
return;

0 commit comments

Comments
 (0)