From 59d67841c1fd901566f092c26620bd302a554a6f Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Wed, 24 Feb 2021 16:46:22 -0800 Subject: [PATCH] Fixing default timezone parsing --- Fluid.Tests/MiscFiltersTests.cs | 25 +++++++++++++++++-------- Fluid/Filters/MiscFilters.cs | 2 +- Fluid/TemplateContext.cs | 10 ++++++++-- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/Fluid.Tests/MiscFiltersTests.cs b/Fluid.Tests/MiscFiltersTests.cs index c7422cc1..77c4a10f 100644 --- a/Fluid.Tests/MiscFiltersTests.cs +++ b/Fluid.Tests/MiscFiltersTests.cs @@ -334,18 +334,13 @@ public void DateNumberIsParsedAsSeconds(long number, string expected) [Fact] public void NoTimeZoneIsParsedAsLocal() { - // This test is issued from a template running in Ruby on a system with -5 TZ - // {{ '1970-01-01 00:00:00' | date: '%c' }} - - // This test ensures that a parsed date without TZ uses the one from the settings - var input = StringValue.Create("1970-01-01 00:00:00"); - var format = new FilterArguments(new StringValue("%+")); - var context = new TemplateContext { TimeZoneUtcOffset = TimeSpan.FromHours(-5) }; + var format = new FilterArguments(new StringValue("%a %b %e %H:%M:%S %Y %z")); + var context = new TemplateContext { TimeZoneUtcOffset = TimeSpan.FromHours(-8) }; var result = MiscFilters.Date(input, format, context); - Assert.Equal("Wed Dec 31 19:00:00 -05:00 1969", result.Result.ToStringValue()); + Assert.Equal("Thu Jan 1 00:00:00 1970 -0800", result.Result.ToStringValue()); } [Fact] @@ -362,6 +357,20 @@ public void TimeZoneIsParsed() Assert.Equal("18000", result.Result.ToStringValue()); } + [Fact] + public void DefaultTimeZoneIsSetWhenNotParsed() + { + // This test ensures that when a TZ is specified it uses it instead of the settings one + var input = StringValue.Create("1970-01-01 00:00:00"); + + var format = new FilterArguments(new StringValue("%s")); + var context = new TemplateContext { TimeZoneUtcOffset = TimeSpan.FromHours(-5) }; + + var result = MiscFilters.Date(input, format, context); + + Assert.Equal("18000", result.Result.ToStringValue()); + } + [Fact] public void DateNumberIsParsedInLocalTimeZone() { diff --git a/Fluid/Filters/MiscFilters.cs b/Fluid/Filters/MiscFilters.cs index fb11f1e1..ae6a2b76 100644 --- a/Fluid/Filters/MiscFilters.cs +++ b/Fluid/Filters/MiscFilters.cs @@ -499,7 +499,7 @@ private static bool TryGetDateTimeInput(FluidValue input, TemplateContext contex { if (dateTime.Kind == DateTimeKind.Unspecified) { - result = new DateTimeOffset(dateTime, context.TimeZoneUtcOffset).Add(context.TimeZoneUtcOffset); + result = new DateTimeOffset(dateTime, context.TimeZoneUtcOffset); } else { diff --git a/Fluid/TemplateContext.cs b/Fluid/TemplateContext.cs index ba21e435..822492ab 100644 --- a/Fluid/TemplateContext.cs +++ b/Fluid/TemplateContext.cs @@ -40,6 +40,7 @@ public TemplateContext(TemplateOptions options) LocalScope.SetValue("blank", StringValue.Empty); CultureInfo = options.CultureInfo; TimeZoneUtcOffset = options.TimeZoneUtcOffset; + Now = options.Now; } /// @@ -59,12 +60,17 @@ public TemplateContext(object model) : this() /// /// Gets or sets the instance used to render locale values like dates and numbers. /// - public CultureInfo CultureInfo { get; set; } + public CultureInfo CultureInfo { get; set; } = TemplateOptions.Default.CultureInfo; + + /// + /// Gets or sets the value to returned by the "now" keyword. + /// + public Func Now { get; set; } = TemplateOptions.Default.Now; /// /// Gets or sets the local Timezone offset used when parsing or creating dates without specific timezone. /// - public TimeSpan TimeZoneUtcOffset { get; set; } = TimeZoneInfo.Local.BaseUtcOffset; + public TimeSpan TimeZoneUtcOffset { get; set; } = TemplateOptions.Default.TimeZoneUtcOffset; internal void IncrementSteps() {