From f5e9d3eb4f4a116dd01e3c9ebfb5f263ef790061 Mon Sep 17 00:00:00 2001 From: ddemeyer Date: Fri, 26 Jan 2024 16:42:23 +0100 Subject: [PATCH] #157 Get-IshBaselineItem parses incoming ModifiedOn and CreatedOn values using CurrentCulture instead resulting in Month Day swapping for some Regional Settings ... Again Regional Options issues on the build server plus actual fix for BaselineItem datetimes parsing --- .../Baseline/GetIshBaselineItem.Tests.ps1 | 5 +- .../HelperClasses/NameHelper.cs | 51 ++++++++++++++----- .../Objects/Public/IshBaselineItem.cs | 6 +-- 3 files changed, 44 insertions(+), 18 deletions(-) diff --git a/Source/ISHRemote/Trisoft.ISHRemote/Cmdlets/Baseline/GetIshBaselineItem.Tests.ps1 b/Source/ISHRemote/Trisoft.ISHRemote/Cmdlets/Baseline/GetIshBaselineItem.Tests.ps1 index b0484717..51a9eb11 100644 --- a/Source/ISHRemote/Trisoft.ISHRemote/Cmdlets/Baseline/GetIshBaselineItem.Tests.ps1 +++ b/Source/ISHRemote/Trisoft.ISHRemote/Cmdlets/Baseline/GetIshBaselineItem.Tests.ps1 @@ -48,8 +48,11 @@ Describe "Get-IshBaselineItem" -Tags "Read" { $day = (Get-Date).Day $month = (Get-Date).Month $bi = (Get-IshBaselineItem -IshObject $ishObject) + # Neutral parsing could lead to DateTime.Min ... + # Can happen with ([System.Globalization.CultureInfo]::CurrentCulture).DateTimeFormat.ShortDatePattern = "MM/dd/yyyy" + $bi[0].ModifiedOn | Should -Not -Be "0001-01-01T00:00:00" + $bi[0].ModifiedOnAsSortableDateTime | Should -Not -Be "0001-01-01T00:00:00.0000000" # Where ModifiedOn is Sunday, August 6, 2023 5:23:45 PM - $bi[0].ModifiedOn | Should -Be $bi[0].ModifiedOnAsSortableDateTime #DEBUG!!! (Get-Date -Date $bi[0].ModifiedOn).Day | Should -Be $day (Get-Date -Date $bi[0].ModifiedOn).Month | Should -Be $month # Where ModifiedOnAsSortableDateTime is 2023-08-06T17:23:45 which is in the future at the time of writing diff --git a/Source/ISHRemote/Trisoft.ISHRemote/HelperClasses/NameHelper.cs b/Source/ISHRemote/Trisoft.ISHRemote/HelperClasses/NameHelper.cs index 44f8b57b..7a90b71c 100644 --- a/Source/ISHRemote/Trisoft.ISHRemote/HelperClasses/NameHelper.cs +++ b/Source/ISHRemote/Trisoft.ISHRemote/HelperClasses/NameHelper.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2014 All Rights Reserved by the SDL Group. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -101,19 +101,7 @@ public PSNoteProperty GetPSNoteProperty(Enumerations.ISHType[] ishTypes, IshMeta case Enumerations.DataType.DateTime: //var formatStrings = new string[] { "dd/MM/yyyy HH:mm:ss", "yyyy-MM-dd hh:mm:ss", "dd/MM/yyy" }; DateTime dateTime; - if (DateTime.TryParseExact(ishField.Value, "dd/MM/yyyy HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime)) - { - propertyValue = dateTime.ToString("s"); - } - else if (DateTime.TryParseExact(ishField.Value, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime)) - { - propertyValue = dateTime.ToString("s"); - } - else if (DateTime.TryParseExact(ishField.Value, "yyyy - MM - ddTHH:mm: ss", System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime)) - { - propertyValue = dateTime.ToString("s"); - } - else if (DateTime.TryParse(ishField.Value, out dateTime)) + if (TryParseDateTimeExact(ishField.Value, out dateTime)) { propertyValue = dateTime.ToString("s"); } @@ -134,6 +122,41 @@ public PSNoteProperty GetPSNoteProperty(Enumerations.ISHType[] ishTypes, IshMeta return new PSNoteProperty("zzzNameHelperError", $"ISHType[{ishTypes}] Level[{ishField.Level.ToString()}] Name[{ishField.Name}] is unknown"); } + /// + /// Single sourcing the fallback mechanism of historical API date formats used on the various CMS APIs + /// This function should be used to avoid generic DateTime parsing based on environemnt variables that are different from classic dd/MM/yyyy. + /// ([System.Globalization.CultureInfo]::CurrentCulture).DateTimeFormat.ShortDatePattern = "dd/MM/yyyy" + /// + /// Incoming API potential DateTime string + /// DateTime object holding a succesful parse. + /// + public static bool TryParseDateTimeExact(string someDateTimeValue, out DateTime outDateTime) + { + DateTime dateTime; + if (DateTime.TryParseExact(someDateTimeValue, "dd/MM/yyyy HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime)) + { + outDateTime = dateTime; + return true; + } + else if (DateTime.TryParseExact(someDateTimeValue, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime)) + { + outDateTime = dateTime; + return true; + } + else if (DateTime.TryParseExact(someDateTimeValue, "yyyy - MM - ddTHH:mm: ss", System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime)) + { + outDateTime = dateTime; + return true; + } + else if (DateTime.TryParse(someDateTimeValue, out dateTime)) + { + outDateTime = dateTime; + return true; + } + outDateTime = DateTime.MinValue; + return false; + } + // Potentially make FileNameHelper static methods public here... } } diff --git a/Source/ISHRemote/Trisoft.ISHRemote/Objects/Public/IshBaselineItem.cs b/Source/ISHRemote/Trisoft.ISHRemote/Objects/Public/IshBaselineItem.cs index 355725cf..4ecb9c12 100644 --- a/Source/ISHRemote/Trisoft.ISHRemote/Objects/Public/IshBaselineItem.cs +++ b/Source/ISHRemote/Trisoft.ISHRemote/Objects/Public/IshBaselineItem.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2014 All Rights Reserved by the SDL Group. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -76,9 +76,9 @@ public IshBaselineItem(string baselineId, XmlElement xmlIshBaselineItem) Author = xmlIshBaselineItem.Attributes["author"].Value; Source = Enumerations.ToBaselineSourceEnumeration(xmlIshBaselineItem.Attributes["source"].Value); DateTime createdOn; - CreatedOn = DateTime.TryParse(xmlIshBaselineItem.Attributes["created"].Value, out createdOn) ? createdOn : DateTime.MinValue; + CreatedOn = NameHelper.TryParseDateTimeExact(xmlIshBaselineItem.Attributes["created"].Value, out createdOn) ? createdOn : DateTime.MinValue; DateTime modifiedOn; - ModifiedOn = DateTime.TryParse(xmlIshBaselineItem.Attributes["modified"].Value, out modifiedOn) ? modifiedOn : DateTime.MinValue; + ModifiedOn = = NameHelper.TryParseDateTimeExact(xmlIshBaselineItem.Attributes["modified"].Value, out modifiedOn) ? modifiedOn : DateTime.MinValue; } ///