mirror of
https://github.com/harttle/liquidjs.git
synced 2026-09-15 04:10:40 -07:00
fix: preserveTimezones support for RFC2822 date, #784
This commit is contained in:
@@ -3,7 +3,11 @@ import { isString } from './underscore'
|
|||||||
|
|
||||||
// one minute in milliseconds
|
// one minute in milliseconds
|
||||||
const OneMinute = 60000
|
const OneMinute = 60000
|
||||||
const ISO8601_TIMEZONE_PATTERN = /([zZ]|([+-])(\d{2}):(\d{2}))$/
|
/**
|
||||||
|
* Need support both ISO8601 and RFC2822 as in major browsers & NodeJS
|
||||||
|
* RFC2822: https://datatracker.ietf.org/doc/html/rfc2822#section-3.3
|
||||||
|
*/
|
||||||
|
const TIMEZONE_PATTERN = /([zZ]|([+-])(\d{2}):?(\d{2}))$/
|
||||||
const monthNames = [
|
const monthNames = [
|
||||||
'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',
|
'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',
|
||||||
'September', 'October', 'November', 'December'
|
'September', 'October', 'November', 'December'
|
||||||
@@ -126,7 +130,7 @@ export class LiquidDate {
|
|||||||
* Given that a template is expected to be parsed fewer times than rendered.
|
* Given that a template is expected to be parsed fewer times than rendered.
|
||||||
*/
|
*/
|
||||||
static createDateFixedToTimezone (dateString: string, locale: string): LiquidDate {
|
static createDateFixedToTimezone (dateString: string, locale: string): LiquidDate {
|
||||||
const m = dateString.match(ISO8601_TIMEZONE_PATTERN)
|
const m = dateString.match(TIMEZONE_PATTERN)
|
||||||
// representing a UTC timestamp
|
// representing a UTC timestamp
|
||||||
if (m && m[1] === 'Z') {
|
if (m && m[1] === 'Z') {
|
||||||
return new LiquidDate(+new Date(dateString), locale, 0)
|
return new LiquidDate(+new Date(dateString), locale, 0)
|
||||||
|
|||||||
@@ -80,19 +80,23 @@ describe('filters/date', function () {
|
|||||||
return test('{{ "1991-02-22T00:00:00" | date: "%Y-%m-%dT%H:%M:%S"}}', '1991-02-22T00:00:00')
|
return test('{{ "1991-02-22T00:00:00" | date: "%Y-%m-%dT%H:%M:%S"}}', '1991-02-22T00:00:00')
|
||||||
})
|
})
|
||||||
describe('when preserveTimezones is enabled', function () {
|
describe('when preserveTimezones is enabled', function () {
|
||||||
const opts: LiquidOptions = { preserveTimezones: true }
|
const opts: LiquidOptions = { preserveTimezones: true, locale: 'en-US' }
|
||||||
|
|
||||||
it('should not change the timezone between input and output', function () {
|
it('should not change the timezone between input and output', function () {
|
||||||
return test('{{ "1990-12-31T23:00:00Z" | date: "%Y-%m-%dT%H:%M:%S"}}', '1990-12-31T23:00:00', undefined, opts)
|
return test('{{ "1990-12-31T23:00:00Z" | date: "%Y-%m-%dT%H:%M:%S"}}', '1990-12-31T23:00:00', undefined, opts)
|
||||||
})
|
})
|
||||||
it('should apply numeric timezone offset (0)', function () {
|
it('should apply numeric timezone offset (0)', function () {
|
||||||
return test('{{ "1990-12-31T23:00:00+00:00" | date: "%Y-%m-%dT%H:%M:%S"}}', '1990-12-31T23:00:00', undefined, opts)
|
return test('{{ "1990-12-31T23:00:00+00:00" | date: "%Y-%m-%dT%H:%M:%S %z"}}', '1990-12-31T23:00:00 +0000', undefined, opts)
|
||||||
})
|
})
|
||||||
it('should apply numeric timezone offset (-1)', function () {
|
it('should apply numeric timezone offset (-1)', function () {
|
||||||
return test('{{ "1990-12-31T23:00:00-01:00" | date: "%Y-%m-%dT%H:%M:%S"}}', '1990-12-31T23:00:00', undefined, opts)
|
return test('{{ "1990-12-31T23:00:00-01:00" | date: "%Y-%m-%dT%H:%M:%S %z"}}', '1990-12-31T23:00:00 -0100', undefined, opts)
|
||||||
})
|
})
|
||||||
it('should apply numeric timezone offset (+2.30)', function () {
|
it('should apply numeric timezone offset (+2.30)', function () {
|
||||||
return test('{{ "1990-12-31T23:00:00+02:30" | date: "%Y-%m-%dT%H:%M:%S"}}', '1990-12-31T23:00:00', undefined, opts)
|
return test('{{ "1990-12-31T23:00:00+02:30" | date: "%Y-%m-%dT%H:%M:%S %z"}}', '1990-12-31T23:00:00 +0230', undefined, opts)
|
||||||
|
})
|
||||||
|
it('should support timezone in more casual JavaScript Date', async () => {
|
||||||
|
await test('{{ "2025-01-02 03:04:05 -0100" | date: "%Y-%m-%dT%H:%M:%S %z" }}', '2025-01-02T03:04:05 -0100', undefined, opts)
|
||||||
|
await test('{{ "2025-01-02 03:04:05 -0100" | date }}', 'Thursday, January 2, 2025 at 3:04 am -0100', undefined, opts)
|
||||||
})
|
})
|
||||||
it('should automatically work when timezone not specified', function () {
|
it('should automatically work when timezone not specified', function () {
|
||||||
return test('{{ "1990-12-31T23:00:00" | date: "%Y-%m-%dT%H:%M:%S"}}', '1990-12-31T23:00:00', undefined, opts)
|
return test('{{ "1990-12-31T23:00:00" | date: "%Y-%m-%dT%H:%M:%S"}}', '1990-12-31T23:00:00', undefined, opts)
|
||||||
|
|||||||
Reference in New Issue
Block a user