feat: convert from using dst offsets to use timezone code
feat: select timezones from current selected country
This commit is contained in:
parent
cc8c48ff4c
commit
7d6fb17158
16 changed files with 86 additions and 117 deletions
|
|
@ -1,89 +1,23 @@
|
|||
import moment from 'moment'
|
||||
import * as R from 'ramda'
|
||||
import { format } from 'date-fns'
|
||||
import { zonedTimeToUtc, utcToZonedTime } from 'date-fns-tz'
|
||||
// import moment from 'moment'
|
||||
// import * as R from 'ramda'
|
||||
|
||||
const getPossibleUTCDSTPairs = timezones =>
|
||||
R.map(
|
||||
it => ({
|
||||
utcOffset: it.utcOffset,
|
||||
dstOffset: it.dstOffset,
|
||||
utcOffsetStr: it.utcOffsetStr,
|
||||
dstOffsetStr: it.dstOffsetStr
|
||||
}),
|
||||
R.uniqBy(
|
||||
it => [it.utcOffset, it.dstOffset, it.utcOffsetStr, it.dstOffsetStr],
|
||||
timezones
|
||||
)
|
||||
)
|
||||
// const buildLabel = tz => {
|
||||
// return `(UTC${tz.utcOffsetStr}) ${R.map(it => it.city, tz.cities).join(', ')}`
|
||||
// }
|
||||
|
||||
const getFormattedTimezones = timezones =>
|
||||
R.sort(
|
||||
R.ascend(R.prop('utcOffset')),
|
||||
R.map(
|
||||
it => ({
|
||||
utcOffset: it.utcOffset,
|
||||
dstOffset: it.dstOffset,
|
||||
utcOffsetStr: it.utcOffsetStr,
|
||||
dstOffsetStr: it.dstOffsetStr,
|
||||
cities: R.map(
|
||||
ite => {
|
||||
const regionCityPair = R.split('/', ite.name)
|
||||
return {
|
||||
region: regionCityPair[0],
|
||||
city: R.replace(/_/g, ' ', regionCityPair[1]),
|
||||
country: ite.country
|
||||
}
|
||||
},
|
||||
R.filter(
|
||||
itx =>
|
||||
R.eqProps('utcOffset', it, itx) &&
|
||||
R.eqProps('dstOffset', it, itx) &&
|
||||
!R.isNil(itx.country) &&
|
||||
!R.includes('Etc', itx.name) &&
|
||||
R.includes('/', itx.name),
|
||||
timezones
|
||||
)
|
||||
)
|
||||
}),
|
||||
getPossibleUTCDSTPairs(timezones)
|
||||
)
|
||||
const formatDate = (date, timezone, pattern) => {
|
||||
const browserTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone
|
||||
const newDate = utcToZonedTime(
|
||||
zonedTimeToUtc(date, browserTimezone),
|
||||
timezone
|
||||
)
|
||||
|
||||
const getFinalTimezones = timezones => {
|
||||
const formattedTimezones = getFormattedTimezones(timezones)
|
||||
const nonEmptyTimezones = R.filter(
|
||||
it => !R.isEmpty(it.cities),
|
||||
formattedTimezones
|
||||
)
|
||||
const nonDuplicateCities = R.map(
|
||||
it => ({
|
||||
...it,
|
||||
cities: R.uniqBy(R.prop('country'), R.uniqBy(R.prop('city'), it.cities))
|
||||
}),
|
||||
nonEmptyTimezones
|
||||
)
|
||||
return nonDuplicateCities
|
||||
return format(newDate, pattern)
|
||||
}
|
||||
|
||||
const buildLabel = tz => {
|
||||
return `(UTC${tz.utcOffsetStr}) ${R.map(it => it.city, tz.cities).join(', ')}`
|
||||
const formatDateNonUtc = (date, pattern) => {
|
||||
return format(date, pattern)
|
||||
}
|
||||
|
||||
const getTzLabels = timezones =>
|
||||
R.map(
|
||||
it => ({ label: buildLabel(it), code: `${it.utcOffset}:${it.dstOffset}` }),
|
||||
getFinalTimezones(timezones)
|
||||
)
|
||||
|
||||
const formatDate = (date, timezoneCode, format) => {
|
||||
const dstOffset = timezoneCode?.split(':')[1] ?? 0
|
||||
return moment
|
||||
.utc(date)
|
||||
.utcOffset(parseInt(dstOffset))
|
||||
.format(format)
|
||||
}
|
||||
|
||||
const formatDateNonUtc = (date, format) => {
|
||||
return moment(date).format(format)
|
||||
}
|
||||
|
||||
export { getTzLabels, formatDate, formatDateNonUtc }
|
||||
export { formatDate, formatDateNonUtc }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue