1313 :id =" inputId "
1414 type="date"
1515 label=""
16- :model-value =" value "
16+ :model-value =" timezoneAdjustedValue "
1717 @input =" onInput " />
1818
1919 <p class =" property__helper-text-message" >
@@ -33,6 +33,16 @@ import { handleError } from '../../utils/handlers.js'
3333
3434const { birthdate } = loadState (' settings' , ' personalInfoParameters' , {})
3535
36+ /**
37+ * Convert a birthdate string value into a Date.
38+ *
39+ * @param {string } birthdateValue - e.g. "1987-12-01" or "1987-12-01T00:00:00.000Z"
40+ * @return {Date}
41+ */
42+ function birthdateValueToDate (birthdateValue ) {
43+ return new Date (birthdateValue)
44+ }
45+
3646export default {
3747 name: ' BirthdaySection' ,
3848
@@ -44,7 +54,7 @@ export default {
4454 data () {
4555 let initialValue = null
4656 if (birthdate .value ) {
47- initialValue = new Date (birthdate .value )
57+ initialValue = birthdateValueToDate (birthdate .value )
4858 }
4959
5060 return {
@@ -62,24 +72,36 @@ export default {
6272 return ` account-property-${ birthdate .name } `
6373 },
6474
65- value: {
66- get () {
67- return new Date (this .birthdate .value )
68- },
75+ value () {
76+ return birthdateValueToDate (this .birthdate .value )
77+ },
6978
70- /** @param {Date} value The date to set */
71- set (value ) {
72- const day = value .getDate ().toString ().padStart (2 , ' 0' )
73- const month = (value .getMonth () + 1 ).toString ().padStart (2 , ' 0' )
74- const year = value .getFullYear ()
75- this .birthdate .value = ` ${ year} -${ month} -${ day} `
76- },
79+ /**
80+ * Adjusted value for usage with `NcDateTimePickerNative` (internally `<input="date">`)
81+ * The saved value is is UTC and we want to show it the same regardless of the browsers/OSs timezone.
82+ * When the adjusted value is displayed and the users timezone is applied, this adjusted value then looks like the UTC value.
83+ */
84+ timezoneAdjustedValue () {
85+ // example: this.birthdate.value === '1987-12-01T00:00:00.000Z' or '1987-12-01'
86+
87+ // example: Mon Nov 30 1987 16:00:00 GMT-0800 (Pacific Standard Time)
88+ // `NcDateTimePickerNative` would show this as 11/30/1987
89+ const date = this .value
90+ const timezoneOffsetMilliseconds = date .getTimezoneOffset () * 60 * 1000
91+ const adjustedDate = new Date (date .getTime () + timezoneOffsetMilliseconds)
92+
93+ // example: Tue Dec 01 1987 00:00:00 GMT-0800 (Pacific Standard Time)
94+ // `NcDateTimePickerNative` will show this as 12/01/1987
95+ return adjustedDate
7796 },
7897 },
7998
8099 methods: {
81100 onInput (e ) {
82- this .value = e
101+ const day = e .getDate ().toString ().padStart (2 , ' 0' )
102+ const month = (e .getMonth () + 1 ).toString ().padStart (2 , ' 0' )
103+ const year = e .getFullYear ()
104+ this .birthdate .value = ` ${ year} -${ month} -${ day} `
83105 this .debouncePropertyChange (this .value )
84106 },
85107
0 commit comments