diff --git a/src/OrchardCore.Modules/OrchardCore.Liquid/Filters/TimeZoneFilter.cs b/src/OrchardCore.Modules/OrchardCore.Liquid/Filters/LocalTimeZoneFilter.cs similarity index 93% rename from src/OrchardCore.Modules/OrchardCore.Liquid/Filters/TimeZoneFilter.cs rename to src/OrchardCore.Modules/OrchardCore.Liquid/Filters/LocalTimeZoneFilter.cs index e5ed10555bb..57ed849a2f5 100644 --- a/src/OrchardCore.Modules/OrchardCore.Liquid/Filters/TimeZoneFilter.cs +++ b/src/OrchardCore.Modules/OrchardCore.Liquid/Filters/LocalTimeZoneFilter.cs @@ -7,11 +7,11 @@ namespace OrchardCore.Liquid.Filters { - public class TimeZoneFilter : ILiquidFilter + public class LocalTimeZoneFilter : ILiquidFilter { private readonly ILocalClock _localClock; - public TimeZoneFilter(ILocalClock localClock) + public LocalTimeZoneFilter(ILocalClock localClock) { _localClock = localClock; } @@ -43,11 +43,9 @@ public async ValueTask ProcessAsync(FluidValue input, FilterArgument case DateTime dateTime: value = dateTime; break; - case DateTimeOffset dateTimeOffset: value = dateTimeOffset; break; - default: return NilValue.Instance; } diff --git a/src/OrchardCore.Modules/OrchardCore.Liquid/Filters/UtcTimeZoneFilter.cs b/src/OrchardCore.Modules/OrchardCore.Liquid/Filters/UtcTimeZoneFilter.cs new file mode 100644 index 00000000000..4cbe18d59c7 --- /dev/null +++ b/src/OrchardCore.Modules/OrchardCore.Liquid/Filters/UtcTimeZoneFilter.cs @@ -0,0 +1,57 @@ +using System; +using System.Globalization; +using System.Threading.Tasks; +using Fluid; +using Fluid.Values; +using OrchardCore.Modules; + +namespace OrchardCore.Liquid.Filters +{ + public class UtcTimeZoneFilter : ILiquidFilter + { + private readonly ILocalClock _localClock; + + public UtcTimeZoneFilter(ILocalClock localClock) + { + _localClock = localClock; + } + + public async ValueTask ProcessAsync(FluidValue input, FilterArguments arguments, LiquidTemplateContext ctx) + { + DateTimeOffset value; + + if (input.Type == FluidValues.String) + { + var stringValue = input.ToStringValue(); + + if (stringValue == "now" || stringValue == "today") + { + value = await _localClock.LocalNowAsync; + } + else + { + if (!DateTimeOffset.TryParse(stringValue, ctx.Options.CultureInfo, DateTimeStyles.AssumeUniversal, out value)) + { + return NilValue.Instance; + } + } + } + else + { + switch (input.ToObjectValue()) + { + case DateTime dateTime: + value = dateTime; + break; + case DateTimeOffset dateTimeOffset: + value = dateTimeOffset; + break; + default: + return NilValue.Instance; + } + } + + return new ObjectValue(await _localClock.ConvertToUtcAsync(value.DateTime)); + } + } +} diff --git a/src/OrchardCore.Modules/OrchardCore.Liquid/Startup.cs b/src/OrchardCore.Modules/OrchardCore.Liquid/Startup.cs index 1b1b332af01..e5159867a95 100644 --- a/src/OrchardCore.Modules/OrchardCore.Liquid/Startup.cs +++ b/src/OrchardCore.Modules/OrchardCore.Liquid/Startup.cs @@ -65,7 +65,8 @@ public override void ConfigureServices(IServiceCollection services) options.Filters.AddFilter("json", JsonFilter.Json); options.Filters.AddFilter("jsonparse", JsonParseFilter.JsonParse); }) - .AddLiquidFilter("local") + .AddLiquidFilter("local") + .AddLiquidFilter("utc") .AddLiquidFilter("slugify") .AddLiquidFilter("liquid") .AddLiquidFilter("href") diff --git a/src/docs/reference/modules/Liquid/README.md b/src/docs/reference/modules/Liquid/README.md index 23a471451eb..e20933d271e 100644 --- a/src/docs/reference/modules/Liquid/README.md +++ b/src/docs/reference/modules/Liquid/README.md @@ -107,6 +107,22 @@ Output Wednesday, 02 August 2017 11:54:48 ``` +### `utc` + +Converts a local date and time to the UTC date and time based on the site settings. + +Input + +```liquid +{{ "now" | utc | date: "%c" }} +``` + +Output + +```text +Wednesday, 02 August 2017 11:54:48 +``` + ### `t` Localizes a string using the current culture.