I am writing a transformation policy for an Azure APIM API. I am having trouble transforming an inbound Date Time field in the JSON formatted Request Body to an output format of the same TimeZone.
The input is formatted: "transactionDateTime": "2023-11-08T18:28:12.123+10:00"
The output needs to be formatted (and in AEST which is +10:00) - this is a hard requirement, so please don't bother to suggest changing it: "2023-11-08T18:28"
I would just treat it as a string (and truncate) if I could, but DotLiquid has determine it is a DateTime and stored it as UTC.
I've tried using DotLiquid (with .Net Date format notation - not the Ruby one):
{{header.transactionDateTime | Date: "yyyy-MM-ddTH:mm" }}
which outputs in UTC (shown in testing a 7am time changes to the day before and the hour to 21): "2023-11-08T8:28"
I've been trying to get access to the Params culture and dateFormat visible in documentation and in the DotLiquid code base. Culture is used in the date filter formatting function:
The documentation shows an example: {% param culture='fr-FR' %} I've tried various combinations (eg. Uppercasing Param) but APIM doesn't want to accept it.
I've also tried using a set-variable policy before the set-body to try setting it, but without guidance I was just stabbing in the dark.
Liquid has a filter in_time_zone but it doesn't exist in the DotLiquid implementation.
From this question I'd ideally like a Azure APIM DotLiquid compatible Date filter format string to enable me to transform the original DateTime to the required output format, failing that, retrieving and/or setting the DotLiquid Template Parameters in an Azure APIM Policy to set the Culture/dateformat, failing that, bonus points for a set-variable c# expression to get the value from the Request Body JSON (path: header.transactionDateTime) and formatting the date to the required output format.
For reference my updated workaround code is:
<set-variable name="obligationDateTimeAEST" value="@{
// Required output needs to be AEST but with no TZ in the output string ie. yyyy-MM-ddTHH:mm
// Workaround for DotLiquid and C# expressions both automatically convert all dates to UTC
// DotLiquid doesn't have any options for Timezone output or Date arithmetic
JObject inBody = context.Request.Body.As<JObject>(preserveContent: true);
DateTime dt = (DateTime) inBody.SelectToken("header.transactionDateTime");
if (dt != null && dt is DateTime) {
try {
// Assumption that C# is automatically converting all dates to UTC and so adding 10 will output AEST
dt = dt.AddHours(10);
return dt.ToString("yyyy-MM-ddTHH:mm");
} catch (ArgumentOutOfRangeException aoore) {
return "Failed AEST Timezone convert";
}
} else {
return "header.transactionDateTime not available";
}
}" />