diff --git a/src/DevToys.Tools.UnitTests/Tools/Converters/DateConverterGuiToolTests.cs b/src/DevToys.Tools.UnitTests/Tools/Converters/DateConverterGuiToolTests.cs index 41c15b9fbc..a2021d0689 100644 --- a/src/DevToys.Tools.UnitTests/Tools/Converters/DateConverterGuiToolTests.cs +++ b/src/DevToys.Tools.UnitTests/Tools/Converters/DateConverterGuiToolTests.cs @@ -8,6 +8,7 @@ namespace DevToys.Tools.UnitTests.Tools.Converters; public class DateConverterGuiToolTests : TestBase { private const string NumberInputText = "date-converter-number-input"; + private const string ISO8601StringInputText = "date-converter-iso8601-text-input"; private const string SelectTimeZoneList = "date-converter-timezone-dropdown"; #region Settings @@ -41,12 +42,12 @@ public DateConverterGuiToolTests() #region DateTimeSeconds [Theory(DisplayName = "Convert valid dateTime with custom epoch and Seconds format should return valid timestamp to Seconds")] - [InlineData("1870-01-01T00:00:00.0000000Z", "1870-01-01T00:00:00.0000000Z", "UTC", 0)] - [InlineData("1923-11-23T19:58:07.0000000Z", "1870-01-01T00:00:00.0000000Z", "UTC", 1700683087)] - [InlineData("1800-11-22T19:58:07.0000000Z", "1870-01-01T00:00:00.0000000Z", "UTC", -2180836913)] - [InlineData("2024-01-01T00:00:00.0000000Z", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", 4859769600)] - [InlineData("1923-11-23T19:58:07.0000000Z", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", 1700711887)] - [InlineData("2024-11-22T19:58:07.0000000Z", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", 4888007887)] + [InlineData("1870-01-01T00:00:00.0000000+00:00", "1870-01-01T00:00:00.0000000Z", "UTC", 0)] + [InlineData("1923-11-23T19:58:07.0000000+00:00", "1870-01-01T00:00:00.0000000Z", "UTC", 1700683087)] + [InlineData("1800-11-22T19:58:07.0000000+00:00", "1870-01-01T00:00:00.0000000Z", "UTC", -2180836913)] + [InlineData("2024-01-01T00:00:00.0000000-08:00", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", 4859769600)] + [InlineData("1923-11-23T19:58:07.0000000-08:00", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", 1700711887)] + [InlineData("2024-11-22T19:58:07.0000000-08:00", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", 4888007887)] public async Task ConvertValidDateTimeWithCustomEpochAndSecondsFormatShouldReturnValidTimestampInSeconds( string dateTimeString, string epochString, @@ -89,16 +90,18 @@ public async Task ConvertValidDateTimeWithCustomEpochAndSecondsFormatShouldRetur await tool.WorkTask; GetGUIElementById(tool.View, NumberInputText).Text.Should().Be(exceptedTimestamp.ToString()); + + GetGUIElementById(tool.View, ISO8601StringInputText).Text.Should().Be(date.ToString("O")); } [Theory(DisplayName = "Convert valid dateTime with unix epoch and Seconds format should return valid timestamp to Seconds", Skip = "Flaky")] - [InlineData("1970-01-01T00:00:00.0000000Z", "UTC", 0)] - [InlineData("2023-11-22T19:58:07.0000000Z", "UTC", 1700683087)] - [InlineData("1900-11-22T19:58:07.0000000Z", "UTC", -2180836913)] - [InlineData("1970-01-01T00:00:00.0000000Z", "Pacific Standard Time", 28800)] - [InlineData("2023-11-22T19:58:07.0000000Z", "Pacific Standard Time", 1700711887)] - [InlineData("1900-11-22T19:58:07.0000000Z", "Pacific Standard Time", -2180808113)] + [InlineData("1970-01-01T00:00:00.0000000+00:00", "UTC", 0)] + [InlineData("2023-11-22T19:58:07.0000000+00:00", "UTC", 1700683087)] + [InlineData("1900-11-22T19:58:07.0000000+00:00", "UTC", -2180836913)] + [InlineData("1970-01-01T00:00:00.0000000-08:00", "Pacific Standard Time", 28800)] + [InlineData("2023-11-22T19:58:07.0000000-08:00", "Pacific Standard Time", 1700711887)] + [InlineData("1900-11-22T19:58:07.0000000-08:00", "Pacific Standard Time", -2180808113)] public async Task ConvertValidDateTimeWithUnixEpochAndSecondsFormatShouldReturnValidTimestampInSeconds( string dateTimeString, string timeZoneString, @@ -131,6 +134,8 @@ public async Task ConvertValidDateTimeWithUnixEpochAndSecondsFormatShouldReturnV await tool.WorkTask; GetGUIElementById(tool.View, NumberInputText).Text.Should().Be(exceptedTimestamp.ToString()); + + GetGUIElementById(tool.View, ISO8601StringInputText).Text.Should().Be(date.ToString("O")); } #endregion @@ -141,9 +146,9 @@ public async Task ConvertValidDateTimeWithUnixEpochAndSecondsFormatShouldReturnV [InlineData(0, "1870-01-01T00:00:00.0000000Z", "UTC", "1870-01-01T00:00:00.0000000Z")] [InlineData(1700683087, "1870-01-01T00:00:00.0000000Z", "UTC", "1923-11-23T19:58:07.0000000Z")] [InlineData(-2180836913, "1870-01-01T00:00:00.0000000Z", "UTC", "1800-11-22T19:58:07.0000000Z")] - [InlineData(0, "2024-01-01T00:00:00.0000000Z", "Pacific Standard Time", "2023-12-31T16:00:00.0000000Z")] - [InlineData(1700683087, "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", "1923-11-23T11:58:07.0000000Z")] - [InlineData(-2180836913, "2024-01-01T00:00:00.0000000Z", "Pacific Standard Time", "1954-11-22T11:58:07.0000000Z")] + [InlineData(0, "2024-01-01T00:00:00.0000000Z", "Pacific Standard Time", "2023-12-31T16:00:00.0000000-08:00")] + [InlineData(1700683087, "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", "1923-11-23T11:58:07.0000000-08:00")] + [InlineData(-2180836913, "2024-01-01T00:00:00.0000000Z", "Pacific Standard Time", "1954-11-22T11:58:07.0000000-08:00")] public async Task ConvertValidTimestampWithCustomEpochAndSecondsFormatShouldReturnValidDateTime( long timestamp, string epochString, @@ -185,15 +190,17 @@ public async Task ConvertValidTimestampWithCustomEpochAndSecondsFormatShouldRetu GetGUIElementById(tool.View, DateHourInputNumber).Text.Should().Be(expectedDate.Hour.ToString()); GetGUIElementById(tool.View, DateMinuteInputNumber).Text.Should().Be(expectedDate.Minute.ToString()); GetGUIElementById(tool.View, DateSecondsInputNumber).Text.Should().Be(expectedDate.Second.ToString()); + + GetGUIElementById(tool.View, ISO8601StringInputText).Text.Should().Be(expectedDate.ToString("O")); } [Theory(DisplayName = "Convert valid timestamp with unix epoch and Seconds format should return valid dateTime")] [InlineData(0, "UTC", "1970-01-01T00:00:00.0000000Z")] [InlineData(1700683087, "UTC", "2023-11-22T19:58:07.0000000Z")] [InlineData(-2180836913, "UTC", "1900-11-22T19:58:07.0000000Z")] - [InlineData(0, "Pacific Standard Time", "1969-12-31T16:00:00.0000000Z")] - [InlineData(1700683087, "Pacific Standard Time", "2023-11-22T11:58:07.0000000Z")] - [InlineData(-2180836913, "Pacific Standard Time", "1900-11-22T11:58:07.0000000Z")] + [InlineData(0, "Pacific Standard Time", "1969-12-31T16:00:00.0000000-08:00")] + [InlineData(1700683087, "Pacific Standard Time", "2023-11-22T11:58:07.0000000-08:00")] + [InlineData(-2180836913, "Pacific Standard Time", "1900-11-22T11:58:07.0000000-08:00")] public async Task ConvertValidTimestampWithUnixEpochAndSecondsFormatShouldReturnValidDateTime( long timestamp, string timeZoneString, @@ -226,6 +233,8 @@ public async Task ConvertValidTimestampWithUnixEpochAndSecondsFormatShouldReturn GetGUIElementById(tool.View, DateMinuteInputNumber).Text.Should().Be(expectedDate.Minute.ToString()); GetGUIElementById(tool.View, DateSecondsInputNumber).Text.Should().Be(expectedDate.Second.ToString()); GetGUIElementById(tool.View, DateMillisecondsInputNumber).Value.Should().Be(0); + + GetGUIElementById(tool.View, ISO8601StringInputText).Text.Should().Be(expectedDate.ToString("O")); } #endregion @@ -236,9 +245,9 @@ public async Task ConvertValidTimestampWithUnixEpochAndSecondsFormatShouldReturn [InlineData("1870-01-01T00:00:00.0000000Z", "1870-01-01T00:00:00.0000000Z", "UTC", 0)] [InlineData("1923-11-23T19:58:07.0000000Z", "1870-01-01T00:00:00.0000000Z", "UTC", 1700683087000)] [InlineData("1800-11-22T19:58:07.0000000Z", "1870-01-01T00:00:00.0000000Z", "UTC", -2180836913000)] - [InlineData("2024-01-01T00:00:00.0000000Z", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", 4859769600000)] - [InlineData("1923-11-23T19:58:07.0000000Z", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", 1700711887000)] - [InlineData("2024-11-22T19:58:07.0000000Z", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", 4888007887000)] + [InlineData("2024-01-01T00:00:00.0000000-08:00", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", 4859769600000)] + [InlineData("1923-11-23T19:58:07.0000000-08:00", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", 1700711887000)] + [InlineData("2024-11-22T19:58:07.0000000-08:00", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", 4888007887000)] public async Task ConvertValidDateTimeWithCustomEpochAndMillisecondsFormatShouldReturnValidTimestampInMilliseconds( string dateTimeString, string epochString, @@ -281,6 +290,8 @@ public async Task ConvertValidDateTimeWithCustomEpochAndMillisecondsFormatShould await tool.WorkTask; GetGUIElementById(tool.View, NumberInputText).Text.Should().Be(exceptedTimestamp.ToString()); + + GetGUIElementById(tool.View, ISO8601StringInputText).Text.Should().Be(date.ToString("O")); } [Theory(DisplayName = "Convert valid dateTime with unix epoch and Milliseconds format should return valid timestamp to Milliseconds", @@ -288,9 +299,9 @@ public async Task ConvertValidDateTimeWithCustomEpochAndMillisecondsFormatShould [InlineData("1970-01-01T00:00:00.0000000Z", "UTC", 0)] [InlineData("2023-11-22T19:58:07.0000000Z", "UTC", 1700683087000)] [InlineData("1900-11-22T19:58:07.0000000Z", "UTC", -2180836913000)] - [InlineData("1970-01-01T00:00:00.0000000Z", "Pacific Standard Time", 28800000)] - [InlineData("2023-11-22T19:58:07.0000000Z", "Pacific Standard Time", 1700711887000)] - [InlineData("1900-11-22T19:58:07.0000000Z", "Pacific Standard Time", -2180808113000)] + [InlineData("1970-01-01T00:00:00.0000000-08:00", "Pacific Standard Time", 28800000)] + [InlineData("2023-11-22T19:58:07.0000000-08:00", "Pacific Standard Time", 1700711887000)] + [InlineData("1900-11-22T19:58:07.0000000-08:00", "Pacific Standard Time", -2180808113000)] public async Task ConvertValidDateTimeWithUnixEpochAndMillisecondsFormatShouldReturnValidTimestampInMilliseconds( string dateTimeString, string timeZoneString, @@ -323,6 +334,8 @@ public async Task ConvertValidDateTimeWithUnixEpochAndMillisecondsFormatShouldRe await tool.WorkTask; GetGUIElementById(tool.View, NumberInputText).Text.Should().Be(exceptedTimestamp.ToString()); + + GetGUIElementById(tool.View, ISO8601StringInputText).Text.Should().Be(date.ToString("O")); } #endregion @@ -333,9 +346,9 @@ public async Task ConvertValidDateTimeWithUnixEpochAndMillisecondsFormatShouldRe [InlineData(0, "1870-01-01T00:00:00.0000000Z", "UTC", "1870-01-01T00:00:00.0000000Z")] [InlineData(1700683087000, "1870-01-01T00:00:00.0000000Z", "UTC", "1923-11-23T19:58:07.0000000Z")] [InlineData(-2180836913000, "1870-01-01T00:00:00.0000000Z", "UTC", "1800-11-22T19:58:07.0000000Z")] - [InlineData(0, "2024-01-01T00:00:00.0000000Z", "Pacific Standard Time", "2023-12-31T16:00:00.0000000Z")] - [InlineData(1700683087000, "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", "1923-11-23T11:58:07.0000000Z")] - [InlineData(-2180836913000, "2024-01-01T00:00:00.0000000Z", "Pacific Standard Time", "1954-11-22T11:58:07.0000000Z")] + [InlineData(0, "2024-01-01T00:00:00.0000000Z", "Pacific Standard Time", "2023-12-31T16:00:00.0000000-08:00")] + [InlineData(1700683087000, "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", "1923-11-23T11:58:07.0000000-08:00")] + [InlineData(-2180836913000, "2024-01-01T00:00:00.0000000Z", "Pacific Standard Time", "1954-11-22T11:58:07.0000000-08:00")] public async Task ConvertValidTimestampWithCustomEpochAndMillisecondsFormatShouldReturnValidDateTime( long timestamp, string epochString, @@ -378,15 +391,17 @@ public async Task ConvertValidTimestampWithCustomEpochAndMillisecondsFormatShoul GetGUIElementById(tool.View, DateMinuteInputNumber).Text.Should().Be(expectedDate.Minute.ToString()); GetGUIElementById(tool.View, DateSecondsInputNumber).Text.Should().Be(expectedDate.Second.ToString()); GetGUIElementById(tool.View, DateMillisecondsInputNumber).Text.Should().Be(expectedDate.Millisecond.ToString()); + + GetGUIElementById(tool.View, ISO8601StringInputText).Text.Should().Be(expectedDate.ToString("O")); } [Theory(DisplayName = "Convert valid timestamp with unix epoch and Milliseconds format should return valid dateTime")] [InlineData(0, "UTC", "1970-01-01T00:00:00.0000000Z")] [InlineData(1700683087000, "UTC", "2023-11-22T19:58:07.0000000Z")] [InlineData(-2180836913000, "UTC", "1900-11-22T19:58:07.0000000Z")] - [InlineData(0, "Pacific Standard Time", "1969-12-31T16:00:00.0000000Z")] - [InlineData(1700683087000, "Pacific Standard Time", "2023-11-22T11:58:07.0000000Z")] - [InlineData(-2180836913000, "Pacific Standard Time", "1900-11-22T11:58:07.0000000Z")] + [InlineData(0, "Pacific Standard Time", "1969-12-31T16:00:00.0000000-08:00")] + [InlineData(1700683087000, "Pacific Standard Time", "2023-11-22T11:58:07.0000000-08:00")] + [InlineData(-2180836913000, "Pacific Standard Time", "1900-11-22T11:58:07.0000000-08:00")] public async Task ConvertValidTimestampWithUnixEpochAndMillisecondsFormatShouldReturnValidDateTime( long timestamp, string timeZoneString, @@ -419,6 +434,175 @@ public async Task ConvertValidTimestampWithUnixEpochAndMillisecondsFormatShouldR GetGUIElementById(tool.View, DateMinuteInputNumber).Text.Should().Be(expectedDate.Minute.ToString()); GetGUIElementById(tool.View, DateSecondsInputNumber).Text.Should().Be(expectedDate.Second.ToString()); GetGUIElementById(tool.View, DateMillisecondsInputNumber).Text.Should().Be(expectedDate.Millisecond.ToString()); + + GetGUIElementById(tool.View, ISO8601StringInputText).Text.Should().Be(expectedDate.ToString("O")); + } + + #endregion + + #region ISO8601String + [Theory(DisplayName = "Convert valid ISO8601 with custom epoch and Seconds format should return valid DateInputNumber and NumberInputText to Seconds")] + [InlineData("1870-01-01T00:00:00.0000000+00:00", "1870-01-01T00:00:00.0000000Z", "UTC", "1870-01-01T00:00:00.0000000+00:00", 0)] + [InlineData("1800-11-22T19:58:07.0000000+00:00", "1870-01-01T00:00:00.0000000Z", "UTC", "1800-11-22T19:58:07.0000000+00:00", -2180836913)] + [InlineData("2024-01-01T00:00:00.0000000-08:00", "1870-01-01T00:00:00.0000000Z", "UTC", "2024-01-01T08:00:00.0000000+00:00", 4859769600)] + [InlineData("1923-11-23T19:58:07.0000000-08:00", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", "1923-11-23T19:58:07.0000000-08:00", 1700711887)] + [InlineData("2024-01-01T08:00:00.0000000+00:00", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", "2024-01-01T00:00:00.0000000-08:00", 4859769600)] + [InlineData("2024-11-22T19:58:07.0000000+09:00", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", "2024-11-22T02:58:07.0000000-08:00", 4887946687)] + public async Task ConvertValidISO8601WithCustomEpochAndSecondsFormatShouldReturnValidDateInputNumberAndNumberInputTextToSeconds( + string dateTimeString, + string epochString, + string timeZoneString, + string exceptedTimeString, + long exceptedTimestamp) + { + var epoch = DateTimeOffset.Parse(epochString, CultureInfo.InvariantCulture); + var expectedDate = DateTimeOffset.Parse(exceptedTimeString, CultureInfo.InvariantCulture); + + DateConverterGuiTool tool = GetToolInstance(); + IUISwitch epochSettings = GetGUIElementById(tool.View, UseCustomEpochSwitch); + IUISelectDropDownList timeZoneDropDownList = GetGUIElementById(tool.View, SelectTimeZoneList); + IUISetting formatSetting = GetGUIElementById(tool.View, DateFormatSetting); + var formatDropdownList = formatSetting.InteractiveElement as IUISelectDropDownList; + + epochSettings.On(); + + int timezoneIndex = Array.FindIndex(timeZoneDropDownList.Items, w => (timeZoneString != "UTC" && w.Text.ToString().Contains(timeZoneString)) || w.Value.Equals(timeZoneString)); + timeZoneDropDownList.Select(timezoneIndex); + + int formatIndex = Array.FindIndex(formatDropdownList.Items, w => w.Value.Equals(DateFormat.Seconds)); + formatDropdownList.Select(formatIndex); + + GetGUIElementById(tool.View, EpochYearInputNumber).Text(epoch.Year.ToString()); + GetGUIElementById(tool.View, EpochMonthInputNumber).Text(epoch.Month.ToString()); + GetGUIElementById(tool.View, EpochDayInputNumber).Text(epoch.Day.ToString()); + GetGUIElementById(tool.View, EpochHourInputNumber).Text(epoch.Hour.ToString()); + GetGUIElementById(tool.View, EpochMinuteInputNumber).Text(epoch.Minute.ToString()); + GetGUIElementById(tool.View, EpochSecondsInputNumber).Text(epoch.Second.ToString()); + GetGUIElementById(tool.View, EpochMillisecondsInputNumber).Text(epoch.Millisecond.ToString()); + + GetGUIElementById(tool.View, ISO8601StringInputText).Text(dateTimeString); + + await tool.WorkTask; + + GetGUIElementById(tool.View, DateYearInputNumber).Text.Should().Be(expectedDate.Year.ToString()); + GetGUIElementById(tool.View, DateMonthInputNumber).Text.Should().Be(expectedDate.Month.ToString()); + GetGUIElementById(tool.View, DateDayInputNumber).Text.Should().Be(expectedDate.Day.ToString()); + GetGUIElementById(tool.View, DateHourInputNumber).Text.Should().Be(expectedDate.Hour.ToString()); + GetGUIElementById(tool.View, DateMinuteInputNumber).Text.Should().Be(expectedDate.Minute.ToString()); + GetGUIElementById(tool.View, DateSecondsInputNumber).Text.Should().Be(expectedDate.Second.ToString()); + + GetGUIElementById(tool.View, NumberInputText).Text.Should().Be(exceptedTimestamp.ToString()); + GetGUIElementById(tool.View, ISO8601StringInputText).Text.Should().Be(expectedDate.ToString("O")); + } + + [Theory(DisplayName = "Convert valid ISO8601 with custom epoch and Milliseconds format should return valid DateInputNumber and NumberInputText to Milliseconds")] + [InlineData("1870-01-01T00:00:00.0000000+00:00", "1870-01-01T00:00:00.0000000Z", "UTC", "1870-01-01T00:00:00.0000000+00:00", 0)] + [InlineData("1800-11-22T19:58:07.0000000+00:00", "1870-01-01T00:00:00.0000000Z", "UTC", "1800-11-22T19:58:07.0000000+00:00", -2180836913000)] + [InlineData("2024-01-01T00:00:00.0000000-08:00", "1870-01-01T00:00:00.0000000Z", "UTC", "2024-01-01T08:00:00.0000000+00:00", 4859769600000)] + [InlineData("1923-11-23T19:58:07.0000000-08:00", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", "1923-11-23T19:58:07.0000000-08:00", 1700711887000)] + [InlineData("2024-01-01T08:00:00.0000000+00:00", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", "2024-01-01T00:00:00.0000000-08:00", 4859769600000)] + [InlineData("2024-11-22T19:58:07.0000000+09:00", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", "2024-11-22T02:58:07.0000000-08:00", 4887946687000)] + public async Task ConvertValidISO8601WithCustomEpochAndMillisecondsFormatShouldReturnValidDateInputNumberAndNumberInputTextToMilliseconds( + string dateTimeString, + string epochString, + string timeZoneString, + string exceptedTimeString, + long exceptedTimestamp) + { + var epoch = DateTimeOffset.Parse(epochString, CultureInfo.InvariantCulture); + var expectedDate = DateTimeOffset.Parse(exceptedTimeString, CultureInfo.InvariantCulture); + + DateConverterGuiTool tool = GetToolInstance(); + IUISwitch epochSettings = GetGUIElementById(tool.View, UseCustomEpochSwitch); + IUISelectDropDownList timeZoneDropDownList = GetGUIElementById(tool.View, SelectTimeZoneList); + IUISetting formatSetting = GetGUIElementById(tool.View, DateFormatSetting); + var formatDropdownList = formatSetting.InteractiveElement as IUISelectDropDownList; + + epochSettings.On(); + + int timezoneIndex = Array.FindIndex(timeZoneDropDownList.Items, w => (timeZoneString != "UTC" && w.Text.ToString().Contains(timeZoneString)) || w.Value.Equals(timeZoneString)); + timeZoneDropDownList.Select(timezoneIndex); + + int formatIndex = Array.FindIndex(formatDropdownList.Items, w => w.Value.Equals(DateFormat.Milliseconds)); + formatDropdownList.Select(formatIndex); + + GetGUIElementById(tool.View, EpochYearInputNumber).Text(epoch.Year.ToString()); + GetGUIElementById(tool.View, EpochMonthInputNumber).Text(epoch.Month.ToString()); + GetGUIElementById(tool.View, EpochDayInputNumber).Text(epoch.Day.ToString()); + GetGUIElementById(tool.View, EpochHourInputNumber).Text(epoch.Hour.ToString()); + GetGUIElementById(tool.View, EpochMinuteInputNumber).Text(epoch.Minute.ToString()); + GetGUIElementById(tool.View, EpochSecondsInputNumber).Text(epoch.Second.ToString()); + GetGUIElementById(tool.View, EpochMillisecondsInputNumber).Text(epoch.Millisecond.ToString()); + + GetGUIElementById(tool.View, ISO8601StringInputText).Text(dateTimeString); + + await tool.WorkTask; + + GetGUIElementById(tool.View, DateYearInputNumber).Text.Should().Be(expectedDate.Year.ToString()); + GetGUIElementById(tool.View, DateMonthInputNumber).Text.Should().Be(expectedDate.Month.ToString()); + GetGUIElementById(tool.View, DateDayInputNumber).Text.Should().Be(expectedDate.Day.ToString()); + GetGUIElementById(tool.View, DateHourInputNumber).Text.Should().Be(expectedDate.Hour.ToString()); + GetGUIElementById(tool.View, DateMinuteInputNumber).Text.Should().Be(expectedDate.Minute.ToString()); + GetGUIElementById(tool.View, DateSecondsInputNumber).Text.Should().Be(expectedDate.Second.ToString()); + GetGUIElementById(tool.View, DateMillisecondsInputNumber).Text.Should().Be(expectedDate.Millisecond.ToString()); + + GetGUIElementById(tool.View, NumberInputText).Text.Should().Be(exceptedTimestamp.ToString()); + GetGUIElementById(tool.View, ISO8601StringInputText).Text.Should().Be(expectedDate.ToString("O")); + } + + [Theory(DisplayName = "Convert valid ISO8601 should return valid Ticks")] + [InlineData("1870-01-01T00:00:00.0000000+00:00", "1870-01-01T00:00:00.0000000Z", "UTC", "1870-01-01T00:00:00.0000000+00:00", 589799232000000000)] + [InlineData("1800-11-22T19:58:07.0000000+00:00", "1870-01-01T00:00:00.0000000Z", "UTC", "1800-11-22T19:58:07.0000000+00:00", 567990862870000000)] + [InlineData("2024-01-01T00:00:00.0000000-08:00", "1870-01-01T00:00:00.0000000Z", "UTC", "2024-01-01T08:00:00.0000000+00:00", 638396928000000000)] + [InlineData("1923-11-23T19:58:07.0000000-08:00", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", "1923-11-23T19:58:07.0000000-08:00", 606806350870000000)] + [InlineData("2024-01-01T08:00:00.0000000+00:00", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", "2024-01-01T00:00:00.0000000-08:00", 638396928000000000)] + [InlineData("2024-11-22T19:58:07.0000000+09:00", "1870-01-01T00:00:00.0000000Z", "Pacific Standard Time", "2024-11-22T02:58:07.0000000-08:00", 638678698870000000)] + public async Task ConvertValidISO8601ShouldReturnValidTicks( + string dateTimeString, + string epochString, + string timeZoneString, + string exceptedTimeString, + long exceptedTimestamp) + { + var epoch = DateTimeOffset.Parse(epochString, CultureInfo.InvariantCulture); + var expectedDate = DateTimeOffset.Parse(exceptedTimeString, CultureInfo.InvariantCulture); + + DateConverterGuiTool tool = GetToolInstance(); + IUISwitch epochSettings = GetGUIElementById(tool.View, UseCustomEpochSwitch); + IUISelectDropDownList timeZoneDropDownList = GetGUIElementById(tool.View, SelectTimeZoneList); + IUISetting formatSetting = GetGUIElementById(tool.View, DateFormatSetting); + var formatDropdownList = formatSetting.InteractiveElement as IUISelectDropDownList; + + epochSettings.On(); + + int timezoneIndex = Array.FindIndex(timeZoneDropDownList.Items, w => (timeZoneString != "UTC" && w.Text.ToString().Contains(timeZoneString)) || w.Value.Equals(timeZoneString)); + timeZoneDropDownList.Select(timezoneIndex); + + int formatIndex = Array.FindIndex(formatDropdownList.Items, w => w.Value.Equals(DateFormat.Ticks)); + formatDropdownList.Select(formatIndex); + + GetGUIElementById(tool.View, EpochYearInputNumber).Text(epoch.Year.ToString()); + GetGUIElementById(tool.View, EpochMonthInputNumber).Text(epoch.Month.ToString()); + GetGUIElementById(tool.View, EpochDayInputNumber).Text(epoch.Day.ToString()); + GetGUIElementById(tool.View, EpochHourInputNumber).Text(epoch.Hour.ToString()); + GetGUIElementById(tool.View, EpochMinuteInputNumber).Text(epoch.Minute.ToString()); + GetGUIElementById(tool.View, EpochSecondsInputNumber).Text(epoch.Second.ToString()); + GetGUIElementById(tool.View, EpochMillisecondsInputNumber).Text(epoch.Millisecond.ToString()); + + GetGUIElementById(tool.View, ISO8601StringInputText).Text(dateTimeString); + + await tool.WorkTask; + + GetGUIElementById(tool.View, DateYearInputNumber).Text.Should().Be(expectedDate.Year.ToString()); + GetGUIElementById(tool.View, DateMonthInputNumber).Text.Should().Be(expectedDate.Month.ToString()); + GetGUIElementById(tool.View, DateDayInputNumber).Text.Should().Be(expectedDate.Day.ToString()); + GetGUIElementById(tool.View, DateHourInputNumber).Text.Should().Be(expectedDate.Hour.ToString()); + GetGUIElementById(tool.View, DateMinuteInputNumber).Text.Should().Be(expectedDate.Minute.ToString()); + GetGUIElementById(tool.View, DateSecondsInputNumber).Text.Should().Be(expectedDate.Second.ToString()); + GetGUIElementById(tool.View, DateMillisecondsInputNumber).Text.Should().Be(expectedDate.Millisecond.ToString()); + + GetGUIElementById(tool.View, NumberInputText).Text.Should().Be(exceptedTimestamp.ToString()); + GetGUIElementById(tool.View, ISO8601StringInputText).Text.Should().Be(expectedDate.ToString("O")); } #endregion @@ -428,9 +612,8 @@ public async Task ConvertValidTimestampWithUnixEpochAndMillisecondsFormatShouldR [InlineData("1923-11-23T19:58:07.0000000+00:00", "UTC", 606806062870000000)] [InlineData("2024-11-22T19:58:07.0000000+00:00", "UTC", 638679022870000000)] [InlineData("2024-01-01T00:00:00.0000000-08:00", "Pacific Standard Time", 638396928000000000)] - [InlineData("2024-01-01T00:00:00.0000000+00:00", "Pacific Standard Time", 638396928000000000)] - [InlineData("1923-11-23T19:58:07.0000000Z", "Pacific Standard Time", 606806350870000000)] - [InlineData("2024-11-22T19:58:07.0000000Z", "Pacific Standard Time", 638679310870000000)] + [InlineData("1923-11-23T19:58:07.0000000-08:00", "Pacific Standard Time", 606806350870000000)] + [InlineData("2024-11-22T19:58:07.0000000-08:00", "Pacific Standard Time", 638679310870000000)] public async Task ConvertValidDateTimeShouldReturnValidTicks( string dateTimeString, string timeZoneString, @@ -463,15 +646,16 @@ public async Task ConvertValidDateTimeShouldReturnValidTicks( await tool.WorkTask; GetGUIElementById(tool.View, NumberInputText).Text.Should().Be(exceptedTicks.ToString()); + GetGUIElementById(tool.View, ISO8601StringInputText).Text.Should().Be(date.ToString("O")); } [Theory(DisplayName = "Convert valid ticks should return valid dateTime")] [InlineData(0, "UTC", "0001-01-01T00:00:00.0000000Z")] [InlineData(638362798870000000, "UTC", "2023-11-22T19:58:07.0000000Z")] [InlineData(599547598870000000, "UTC", "1900-11-22T19:58:07.0000000Z")] - [InlineData(0, "Pacific Standard Time", "0001-01-01T00:00:00.0000000Z")] - [InlineData(638362798870000000, "Pacific Standard Time", "2023-11-22T11:58:07.0000000Z")] - [InlineData(599547598870000000, "Pacific Standard Time", "1900-11-22T11:58:07.0000000Z")] + [InlineData(0, "Pacific Standard Time", "0001-01-01T00:00:00.0000000+00:00")] + [InlineData(638362798870000000, "Pacific Standard Time", "2023-11-22T11:58:07.0000000-08:00")] + [InlineData(599547598870000000, "Pacific Standard Time", "1900-11-22T11:58:07.0000000-08:00")] public async Task ConvertValidTicksWithTicksFormatShouldReturnValidDateTime( long ticks, string timeZoneString, @@ -504,6 +688,8 @@ public async Task ConvertValidTicksWithTicksFormatShouldReturnValidDateTime( GetGUIElementById(tool.View, DateMinuteInputNumber).Text.Should().Be(expectedDate.Minute.ToString()); GetGUIElementById(tool.View, DateSecondsInputNumber).Text.Should().Be(expectedDate.Second.ToString()); GetGUIElementById(tool.View, DateMillisecondsInputNumber).Text.Should().Be(expectedDate.Millisecond.ToString()); + + GetGUIElementById(tool.View, ISO8601StringInputText).Text.Should().Be(expectedDate.ToString("O")); } private static T GetGUIElementById(UIToolView toolView, string name) diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.Designer.cs b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.Designer.cs index 2630c163d4..289d76fd26 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.Designer.cs +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.Designer.cs @@ -221,7 +221,18 @@ internal static string InvalidValue { return ResourceManager.GetString("InvalidValue", resourceCulture); } } - + + /// + /// Looks up a localized string similar to ISO8601 Title. + /// + internal static string ISO8601Title + { + get + { + return ResourceManager.GetString("ISO8601Title", resourceCulture); + } + } + /// /// Looks up a localized string similar to Local Date and Time. /// diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.af-ZA.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.af-ZA.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.af-ZA.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.af-ZA.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ar-SA.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ar-SA.resx index 42a13c1e7d..79e726d2b1 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ar-SA.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ar-SA.resx @@ -246,4 +246,7 @@ الرجاء تحديد مدخل أرقام أو تاريخ + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.bn-BD.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.bn-BD.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.bn-BD.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.bn-BD.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ca-ES.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ca-ES.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ca-ES.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ca-ES.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.cs-CZ.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.cs-CZ.resx index 446c716e4a..cb49c1484a 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.cs-CZ.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.cs-CZ.resx @@ -246,4 +246,7 @@ Zadejte prosím vstupní číslo nebo datum + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.da-DK.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.da-DK.resx index 27c5d5659e..71faa452a3 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.da-DK.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.da-DK.resx @@ -246,4 +246,7 @@ Angiv inputnummer eller dato + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.de-DE.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.de-DE.resx index 7a8aaf2cfc..eba0748efb 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.de-DE.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.de-DE.resx @@ -246,4 +246,7 @@ Bitte gib eine Eingabenummer oder ein Datum an + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.el-GR.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.el-GR.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.el-GR.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.el-GR.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.en-GB.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.en-GB.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.en-GB.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.en-GB.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.es-AR.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.es-AR.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.es-AR.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.es-AR.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.es-ES.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.es-ES.resx index c24d7ed754..ba276a400e 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.es-ES.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.es-ES.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.fi-FI.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.fi-FI.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.fi-FI.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.fi-FI.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.fr-FR.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.fr-FR.resx index af0f4e9141..483f85573d 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.fr-FR.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.fr-FR.resx @@ -246,4 +246,7 @@ Veuillez spécifier un numéro ou une date d'entrée + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.he-IL.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.he-IL.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.he-IL.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.he-IL.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.hi-IN.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.hi-IN.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.hi-IN.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.hi-IN.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.hu-HU.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.hu-HU.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.hu-HU.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.hu-HU.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.id-ID.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.id-ID.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.id-ID.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.id-ID.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.it-IT.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.it-IT.resx index 8982c5be83..1e681e9eba 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.it-IT.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.it-IT.resx @@ -246,4 +246,7 @@ Specifica un numero o una data + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ja-JP.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ja-JP.resx index 6b621416fa..b272730456 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ja-JP.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ja-JP.resx @@ -246,4 +246,7 @@ 数値または日付を入力してください + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.kn-IN.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.kn-IN.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.kn-IN.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.kn-IN.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ko-KR.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ko-KR.resx index d1e6c86fb7..c00994ceca 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ko-KR.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ko-KR.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.kw-GB.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.kw-GB.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.kw-GB.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.kw-GB.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.nb.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.nb.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.nb.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.nb.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.nl-NL.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.nl-NL.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.nl-NL.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.nl-NL.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.pl-PL.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.pl-PL.resx index ce027b8d9f..2136e0d96a 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.pl-PL.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.pl-PL.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.pt-BR.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.pt-BR.resx index 3dc965ee3b..01125d72f9 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.pt-BR.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.pt-BR.resx @@ -246,4 +246,7 @@ Por favor, especifique um número ou data de entrada + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.pt-PT.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.pt-PT.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.pt-PT.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.pt-PT.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.resx index 06165a85d5..5850f5cdb1 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ro-RO.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ro-RO.resx index 74a6f9af5d..c797908a46 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ro-RO.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ro-RO.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ru-RU.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ru-RU.resx index acef83f502..c24a84cc80 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ru-RU.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ru-RU.resx @@ -246,4 +246,7 @@ Пожалуйста, укажите номер или дату ввода + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.sr-SP.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.sr-SP.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.sr-SP.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.sr-SP.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.sv-SE.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.sv-SE.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.sv-SE.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.sv-SE.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ta-IN.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ta-IN.resx index 0dbcba625d..822a614b71 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ta-IN.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.ta-IN.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.te-IN.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.te-IN.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.te-IN.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.te-IN.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.tr-TR.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.tr-TR.resx index 3d6da325fd..8f646bea57 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.tr-TR.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.tr-TR.resx @@ -246,4 +246,7 @@ Lütfen bir girdi sayısı ya da tarihi belirtin + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.uk-UA.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.uk-UA.resx index 65a51b4576..0ef60e30d4 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.uk-UA.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.uk-UA.resx @@ -246,4 +246,7 @@ Будь ласка, вкажіть вхідний номер або дату + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.vi-VN.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.vi-VN.resx index c7474a77d8..23b23bd2e5 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.vi-VN.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.vi-VN.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.zh-Hans.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.zh-Hans.resx index 4aa2038220..dd9abf2e84 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.zh-Hans.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.zh-Hans.resx @@ -246,4 +246,7 @@ 请输入数字或日期 + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.zh-Hant.resx b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.zh-Hant.resx index ec5d82ae0e..db8d472a28 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverter.zh-Hant.resx +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverter.zh-Hant.resx @@ -246,4 +246,7 @@ Please specify an input number or date + + ISO 8601 + \ No newline at end of file diff --git a/src/DevToys.Tools/Tools/Converters/Date/DateConverterGuiTool.cs b/src/DevToys.Tools/Tools/Converters/Date/DateConverterGuiTool.cs index 1400008874..873d2d83ee 100644 --- a/src/DevToys.Tools/Tools/Converters/Date/DateConverterGuiTool.cs +++ b/src/DevToys.Tools/Tools/Converters/Date/DateConverterGuiTool.cs @@ -1,4 +1,5 @@ using System.Collections.ObjectModel; +using System.Globalization; using System.Text.RegularExpressions; using DevToys.Tools.Helpers; using DevToys.Tools.Models; @@ -94,6 +95,8 @@ private IUIDropDownListItem SelectedTimeZoneDropDownItem private readonly IUINumberInput _numberInputText = NumberInput("date-converter-number-input"); + private readonly IUISingleLineTextInput _iso8601FormatTextInput = SingleLineTextInput("date-converter-iso8601-text-input"); + private readonly IUISelectDropDownList _selectTimeZoneList = SelectDropDownList("date-converter-timezone-dropdown"); private readonly IUISettingGroup _customEpochSetting = SettingGroup("date-converter-custom-epoch-setting"); @@ -224,6 +227,9 @@ public UIToolView View .Minimum(-2177452704000000) // Ticks max value .Maximum(3155861951990000000), + _iso8601FormatTextInput + .Title(DateConverter.ISO8601Title) + .OnTextChanged(OnISOChanged), DateTimeStack() ) ) @@ -394,6 +400,40 @@ private void OnTimeStampChanged(string value) StartNumberConvert(Convert.ToInt64(number), epochToUse, timeZoneInfo, format); } + private void OnISOChanged(string value) + { + if (_ignoreInputTextChange) + { + return; + } + + if (string.IsNullOrEmpty(value)) + { + _errorInfoBar.Description(DateConverter.InvalidValue); + _errorInfoBar.Open(); + return; + } + + var timeZoneRegex = new Regex(@"[+-][0-9]{2}:[0-9]{2}|Z$"); + if (!timeZoneRegex.IsMatch(value)) + { + _errorInfoBar.Description(DateConverter.InvalidValue); + _errorInfoBar.Open(); + return; + } + + if (!DateTimeOffset.TryParse(value, out DateTimeOffset dateTimeOffset)) + { + _errorInfoBar.Description(DateConverter.InvalidValue); + _errorInfoBar.Open(); + return; + } + + _errorInfoBar.Close(); + _settingsProvider.SetSetting(currentTimeSettings, dateTimeOffset); + StartDateTimeConvert(dateTimeOffset); + } + private void StartNumberConvert( long number, DateTimeOffset epoch, @@ -431,6 +471,7 @@ private async Task ConvertNumberAsync( DateTimeOffset convertedDateTime = TimeZoneInfo.ConvertTime(result.Data, timeZone); PopulateDate(convertedDateTime); _numberInputText.Text(number.ToString()); + _iso8601FormatTextInput.Text(convertedDateTime.ToString("O")); _settingsProvider.SetSetting(currentTimeSettings, convertedDateTime); @@ -479,6 +520,7 @@ private async Task ConvertDateTimeOffsetAsync( _numberInputText.Text(result.Data.ToString()); DateTimeOffset convertedDateTime = TimeZoneInfo.ConvertTime(dateTimeOffset, timeZone); + _iso8601FormatTextInput.Text(convertedDateTime.ToString("O")); PopulateDate(convertedDateTime); ComputeDstInformation(convertedDateTime, timeZone); }