From 4c060b468a6887b0dfa6c658d6b7a5583a377561 Mon Sep 17 00:00:00 2001 From: Vladimir Pecanac Date: Sun, 30 Aug 2026 18:42:27 +0200 Subject: [PATCH] Parsing DateTime: retarget net10.0, fix the misused format constant, file-scoped namespaces Retargets both projects net7.0 -> net10.0 and lifts the test packages: Microsoft.NET.Test.Sdk 17.3.2 -> 18.9.0, xunit 2.4.2 -> 2.9.3, xunit.runner.visualstudio 2.4.5 -> 4.0.0, coverlet.collector 3.1.2 -> 10.0.1. Fixes a real defect in the sample. DATEFORMAT_DDMYYYY_HHMMSS held a date string, "15/1/2023 10:12:12", and was passed as ParseExact's format argument. It did not throw: every digit in it is a literal character and "/" and ":" happen to match fr-FR's separators, so the pattern matched the input, extracted no date or time component, and ParseExact filled the empty result from the current date. The program printed today at midnight and changed every day, while the source comment claimed 15/01/2023 10:12:12 AM. The tests never saw it because ParseExactTest.cs uses the correct "dd/M/yyyy hh:mm:ss". The constant now holds that format string. Fixes a second drift against the article. The Parse(String) demonstration is the only one that parses with the current culture, and the article passes it a US-shaped string, "1/15/2023 02:21:37". The sample passed it the day-first string used by the fr-FR overloads, so the first demonstration threw a FormatException on a US machine and the whole Parse region was skipped. The two strings are now two constants, matching the article snippet by snippet. Output comments are reset from an actual run and now say which culture they assume, since Console.WriteLine formats a DateTime with CurrentCulture whatever culture parsed it. Console.ReadKey() is dropped so the sample can run non-interactively. Idiom lift: file-scoped namespaces in all five files, and Program.cs becomes top-level statements. The long method names are deliberately unchanged; they are the article's H3 titles made executable. --- .../ParsingDateTimeInCSharp.Test.csproj | 10 +- .../ParseExactMethod.cs | 79 ++- .../ParsingDateTimeInCSharp/ParseMethod.cs | 27 +- .../ParsingDateTimeInCSharp.csproj | 2 +- .../ParsingDateTimeInCSharp/Program.cs | 457 +++++++++--------- .../TryParseExactMethod.cs | 51 +- .../ParsingDateTimeInCSharp/TryParseMethod.cs | 31 +- 7 files changed, 322 insertions(+), 335 deletions(-) diff --git a/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp.Test/ParsingDateTimeInCSharp.Test.csproj b/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp.Test/ParsingDateTimeInCSharp.Test.csproj index 71d96b4082..b15652156c 100644 --- a/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp.Test/ParsingDateTimeInCSharp.Test.csproj +++ b/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp.Test/ParsingDateTimeInCSharp.Test.csproj @@ -1,7 +1,7 @@ - net7.0 + net10.0 enable enable @@ -9,13 +9,13 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/ParseExactMethod.cs b/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/ParseExactMethod.cs index 641380cb90..ed04bc391b 100644 --- a/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/ParseExactMethod.cs +++ b/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/ParseExactMethod.cs @@ -1,56 +1,55 @@ using System.Globalization; -namespace ParsingDateTimeInCSharp +namespace ParsingDateTimeInCSharp; + +public static class ParseExactMethod { - public static class ParseExactMethod - { - public static DateTime ParseExactWithStringAndStringAndFormatProviderInputParameters(string dateString, string format, string culture) - => DateTime.ParseExact(dateString, format, new CultureInfo(culture)); + public static DateTime ParseExactWithStringAndStringAndFormatProviderInputParameters(string dateString, string format, string culture) + => DateTime.ParseExact(dateString, format, new CultureInfo(culture)); - public static DateTime ParseExactWithStringAndStringAndFormatProviderAndDateTimeStylesInputParameters(string dateString, string format, string culture, DateTimeStyles dateTimeStyles) - => DateTime.ParseExact(dateString, format, new CultureInfo(culture), dateTimeStyles); + public static DateTime ParseExactWithStringAndStringAndFormatProviderAndDateTimeStylesInputParameters(string dateString, string format, string culture, DateTimeStyles dateTimeStyles) + => DateTime.ParseExact(dateString, format, new CultureInfo(culture), dateTimeStyles); - public static DateTime ParseExactWithSpanAndSpanAndFormatProviderAndDateTimeStylesInputParameters(string dateString, string format, string culture, DateTimeStyles dateTimeStyles) - => DateTime.ParseExact(dateString.AsSpan(), format.AsSpan(), new CultureInfo(culture), dateTimeStyles); - - public static Dictionary ParseExactWithStringAndStringArrayAndFormatProviderAndDateTimeStylesInputParameters(Dictionary dateStrings, string[] formats, CultureInfo cultureInfo, DateTimeStyles dateTimeStyles) - { - var result = new Dictionary(); + public static DateTime ParseExactWithSpanAndSpanAndFormatProviderAndDateTimeStylesInputParameters(string dateString, string format, string culture, DateTimeStyles dateTimeStyles) + => DateTime.ParseExact(dateString.AsSpan(), format.AsSpan(), new CultureInfo(culture), dateTimeStyles); + + public static Dictionary ParseExactWithStringAndStringArrayAndFormatProviderAndDateTimeStylesInputParameters(Dictionary dateStrings, string[] formats, CultureInfo cultureInfo, DateTimeStyles dateTimeStyles) + { + var result = new Dictionary(); - try - { - foreach (string format in formats) - { - var dateString = dateStrings[format]; - result.Add(dateString, DateTime.ParseExact(dateString, formats, cultureInfo, dateTimeStyles)); - } - } - catch (FormatException ex) + try + { + foreach (string format in formats) { - Console.WriteLine(ex.Message); + var dateString = dateStrings[format]; + result.Add(dateString, DateTime.ParseExact(dateString, formats, cultureInfo, dateTimeStyles)); } - - return result; } - - public static Dictionary ParseExactWithSpanAndStringArrayAndFormatProviderAndDateTimeStylesInputParameters(Dictionary dateStrings, string[] formats, CultureInfo cultureInfo, DateTimeStyles dateTimeStyles) + catch (FormatException ex) { - var result = new Dictionary(); + Console.WriteLine(ex.Message); + } - try - { - foreach (string format in formats) - { - var dateString = dateStrings[format]; - result.Add(dateString, DateTime.ParseExact(dateString.AsSpan(), formats, cultureInfo, dateTimeStyles)); - } - } - catch (FormatException ex) + return result; + } + + public static Dictionary ParseExactWithSpanAndStringArrayAndFormatProviderAndDateTimeStylesInputParameters(Dictionary dateStrings, string[] formats, CultureInfo cultureInfo, DateTimeStyles dateTimeStyles) + { + var result = new Dictionary(); + + try + { + foreach (string format in formats) { - Console.WriteLine(ex.Message); + var dateString = dateStrings[format]; + result.Add(dateString, DateTime.ParseExact(dateString.AsSpan(), formats, cultureInfo, dateTimeStyles)); } - - return result; } + catch (FormatException ex) + { + Console.WriteLine(ex.Message); + } + + return result; } } diff --git a/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/ParseMethod.cs b/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/ParseMethod.cs index c7ba1443df..ad14cee1df 100644 --- a/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/ParseMethod.cs +++ b/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/ParseMethod.cs @@ -1,23 +1,22 @@ using System.Globalization; -namespace ParsingDateTimeInCSharp +namespace ParsingDateTimeInCSharp; + +public static class ParseMethod { - public static class ParseMethod - { - public static DateTime ParseWithStringInputParameter(string dateString) - => DateTime.Parse(dateString); + public static DateTime ParseWithStringInputParameter(string dateString) + => DateTime.Parse(dateString); - public static DateTime ParseWithStringAndFormatProviderInputParameters(string dateString, string culture) - => DateTime.Parse(dateString, new CultureInfo(culture)); + public static DateTime ParseWithStringAndFormatProviderInputParameters(string dateString, string culture) + => DateTime.Parse(dateString, new CultureInfo(culture)); - public static DateTime ParseWithStringAndFormatProviderAndDateTimeStylesInputParameters(string dateString, string culture, DateTimeStyles dateTimeStyles) - => DateTime.Parse(dateString, new CultureInfo(culture), dateTimeStyles); + public static DateTime ParseWithStringAndFormatProviderAndDateTimeStylesInputParameters(string dateString, string culture, DateTimeStyles dateTimeStyles) + => DateTime.Parse(dateString, new CultureInfo(culture), dateTimeStyles); - public static DateTime ParseWithSpanAndFormatProviderInputParameters(string dateString, string culture) - => DateTime.Parse(dateString.AsSpan(), new CultureInfo(culture)); + public static DateTime ParseWithSpanAndFormatProviderInputParameters(string dateString, string culture) + => DateTime.Parse(dateString.AsSpan(), new CultureInfo(culture)); - public static DateTime ParseWithSpanAndFormatProviderAndDateTimeStylesInputParameters(string dateString, string culture, DateTimeStyles dateTimeStyles) - => DateTime.Parse(dateString.AsSpan(), new CultureInfo(culture), dateTimeStyles); - } + public static DateTime ParseWithSpanAndFormatProviderAndDateTimeStylesInputParameters(string dateString, string culture, DateTimeStyles dateTimeStyles) + => DateTime.Parse(dateString.AsSpan(), new CultureInfo(culture), dateTimeStyles); } diff --git a/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp.csproj b/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp.csproj index f02677bf64..dfb40caafc 100644 --- a/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp.csproj +++ b/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net10.0 enable enable diff --git a/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/Program.cs b/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/Program.cs index a445576174..d57daa451b 100644 --- a/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/Program.cs +++ b/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/Program.cs @@ -1,234 +1,225 @@ -using System.Globalization; - -namespace ParsingDateTimeInCSharp +using System.Globalization; +using ParsingDateTimeInCSharp; + +const string DATESTRING_MMDDYYYY_HHMMSS = "1/15/2023 02:21:37"; +const string DATESTRING_DDMYYYY_HHMMSS_TIME = "15/1/2023 02:21:37"; +const string DATESTRING_MMDDYYYY = "1/15/2023"; +const string DATESTRING_DDMMYYYY = "15/1/2023"; +const string DATESTRING_DD_MM_YYYY = "15-01-2023"; +const string DATESTRING_EST_TIMEZONE = "2023/1/15 14:21:37-05:00"; +const string DATESTRING_DDMYYYY_HHMMSS = "15/1/2023 10:12:12"; + +const string DATEFORMAT_DD_MM_YYYY = "dd-MM-yyyy"; +const string DATEFORMAT_DDMYYYY_HHMMSS = "dd/M/yyyy hh:mm:ss"; +const string DATESTRING_YYYYMMDD_ROUNDTRIP = "2023-01-15T14:12:12.0000000Z"; +const string DATEFORMAT_ROUNDTRIP = "o"; + +const string CULTURE_FR = "fr-FR"; +const string CULTURE_EN_GB = "en-GB"; + +const DateTimeStyles STYLE_ASSUME_UNIVERSAL = DateTimeStyles.AssumeUniversal; +const DateTimeStyles STYLE_ADJUST_TO_UNIVERSAL = DateTimeStyles.AdjustToUniversal; +const DateTimeStyles STYLE_NONE = DateTimeStyles.None; +const DateTimeStyles STYLE_ROUND_TRIP = DateTimeStyles.RoundtripKind; + +var cultureInvariant = CultureInfo.InvariantCulture; + +string[] dateFormats = { "yyyy-MM-dd'T'HH:mm:ss.fff'Z'", "yyyy-MM-dd'T'HH:mm:ss'Z'", "yyyyMMdd'T'HH:mm:ss.fff'Z'", "yyyyMMdd'T'HH:mm:ss'Z'", "dd-MM-yyyy HH:mm:ss", "dd/MM/yyyy HH:mm:ss" }; +var dateStringKeyValuePairs = new Dictionary +{ + { "yyyy-MM-dd'T'HH:mm:ss.fff'Z'", "2023-01-15T14:12:12.000Z" }, + { "yyyy-MM-dd'T'HH:mm:ss'Z'", "2023-01-15T14:12:12Z" }, + { "yyyyMMdd'T'HH:mm:ss.fff'Z'", "20230115T14:12:12.000Z" }, + { "yyyyMMdd'T'HH:mm:ss'Z'", "20230115T14:12:12Z" }, + { "dd-MM-yyyy HH:mm:ss", "15-01-2023 14:12:12" }, + { "dd/MM/yyyy HH:mm:ss", "15/01/2023 14:12:12" } +}; + +/* + * Printing the Current Culture + */ +DateTime date = new(2023, 1, 15, 14, 21, 37); +Console.WriteLine($"My current culture: {CultureInfo.CurrentCulture}"); +Console.WriteLine($"My date in the current culture({CultureInfo.CurrentCulture}): {date}"); + +/* + * Changing the Current Culture + */ +var culture = CultureInfo.GetCultureInfo("en-GB"); +Console.WriteLine($"My date in the culture({culture}): {date.ToString(culture)}"); +Console.WriteLine($"Current Culture: {Thread.CurrentThread.CurrentCulture.Name}"); + +#region Parse overloads + +Console.WriteLine("\nOverload: Parse()"); +try +{ + /* + * Parse(String) + */ + Console.WriteLine("\nOverload: Parse(String)"); + Console.WriteLine(ParseMethod.ParseWithStringInputParameter(DATESTRING_MMDDYYYY_HHMMSS)); /* Output under en-US: 1/15/2023 2:21:37 AM */ + + /* + * Parse(String, IFormatProvider) + */ + Console.WriteLine("\nOverload: Parse(String, IFormatProvider)"); + Console.WriteLine(ParseMethod.ParseWithStringAndFormatProviderInputParameters(DATESTRING_DDMYYYY_HHMMSS_TIME, CULTURE_FR)); /* Output under en-US: 1/15/2023 2:21:37 AM */ + + /* + * Parse(String, IFormatProvider, DateTimeStyles) + */ + Console.WriteLine("\nParse(String, IFormatProvider, DateTimeStyles)"); + Console.WriteLine(ParseMethod.ParseWithStringAndFormatProviderAndDateTimeStylesInputParameters(DATESTRING_DDMYYYY_HHMMSS_TIME, CULTURE_FR, STYLE_ASSUME_UNIVERSAL)); /* Output under en-US, host at UTC+01:00: 1/15/2023 3:21:37 AM */ + + /* + * Parse(ReadOnlySpan, IFormatProvider) + */ + Console.WriteLine("\nParse(ReadOnlySpan, IFormatProvider)"); + Console.WriteLine(ParseMethod.ParseWithSpanAndFormatProviderInputParameters(DATESTRING_DDMYYYY_HHMMSS_TIME, CULTURE_FR)); /* Output under en-US: 1/15/2023 2:21:37 AM */ + + /* + * Parse(ReadOnlySpan, IFormatProvider, DateTimeStyles) + */ + Console.WriteLine("\nParse(ReadOnlySpan, IFormatProvider, DateTimeStyles)"); + Console.WriteLine(ParseMethod.ParseWithSpanAndFormatProviderAndDateTimeStylesInputParameters(DATESTRING_DDMYYYY_HHMMSS_TIME, CULTURE_FR, STYLE_ASSUME_UNIVERSAL)); /* Output under en-US, host at UTC+01:00: 1/15/2023 3:21:37 AM */ +} +catch (ArgumentNullException e) +{ + Console.WriteLine(e.Message); +} +catch (ArgumentException e) +{ + Console.WriteLine(e.Message); +} +catch (FormatException e) { - internal class Program - { - private const string DATESTRING = "15/1/2023 02:21:37"; - private const string DATESTRING_MMDDYYYY = "1/15/2023"; - private const string DATESTRING_DDMMYYYY = "15/1/2023"; - private const string DATESTRING_DD_MM_YYYY = "15-01-2023"; - private const string DATESTRING_EST_TIMEZONE = "2023/1/15 14:21:37-05:00"; - private const string DATESTRING_DDMYYYY_HHMMSS = "15/1/2023 10:12:12"; - - private const string DATEFORMAT_DD_MM_YYYY = "dd-MM-yyyy"; - private const string DATEFORMAT_DDMYYYY_HHMMSS = "15/1/2023 10:12:12"; - private const string DATESTRING_YYYYMMDD_ROUNDTRIP = "2023-01-15T14:12:12.0000000Z"; - private const string DATEFORMAT_ROUNDTRIP = "o"; - - private const string CULTURE_FR = "fr-FR"; - private const string CULTURE_EN_GB = "en-GB"; - - private const DateTimeStyles STYLE_ASSUME_UNIVERSAL = DateTimeStyles.AssumeUniversal; - private const DateTimeStyles STYLE_ADJUST_TO_UNIVERSAL = DateTimeStyles.AdjustToUniversal; - private const DateTimeStyles STYLE_NONE = DateTimeStyles.None; - private const DateTimeStyles STYLE_ROUND_TRIP = DateTimeStyles.RoundtripKind; - - private static readonly CultureInfo _cultureInvariant = CultureInfo.InvariantCulture; - - private static readonly string[] _dateFormats = { "yyyy-MM-dd'T'HH:mm:ss.fff'Z'", "yyyy-MM-dd'T'HH:mm:ss'Z'", "yyyyMMdd'T'HH:mm:ss.fff'Z'", "yyyyMMdd'T'HH:mm:ss'Z'", "dd-MM-yyyy HH:mm:ss", "dd/MM/yyyy HH:mm:ss" }; - private static readonly Dictionary _dateStringKeyValuePairs = new() - { - { "yyyy-MM-dd'T'HH:mm:ss.fff'Z'", "2023-01-15T14:12:12.000Z" }, - { "yyyy-MM-dd'T'HH:mm:ss'Z'", "2023-01-15T14:12:12Z" }, - { "yyyyMMdd'T'HH:mm:ss.fff'Z'", "20230115T14:12:12.000Z" }, - { "yyyyMMdd'T'HH:mm:ss'Z'", "20230115T14:12:12Z" }, - { "dd-MM-yyyy HH:mm:ss", "15-01-2023 14:12:12" }, - { "dd/MM/yyyy HH:mm:ss", "15/01/2023 14:12:12" } - }; - - static void Main(string[] args) - { - /* - * Printing the Current Culture - */ - DateTime date = new(2023, 1, 15, 14, 21, 37); - Console.WriteLine($"My current culture: {CultureInfo.CurrentCulture}"); - Console.WriteLine($"My date in the current culture({CultureInfo.CurrentCulture}): {date}"); - - /* - * Changing the Current Culture - */ - var culture = CultureInfo.GetCultureInfo("en-GB"); - Console.WriteLine($"My date in the culture({culture}): {date.ToString(culture)}"); - Console.WriteLine($"Current Culture: {Thread.CurrentThread.CurrentCulture.Name}"); - - #region Parse overloads - - Console.WriteLine("\nOverload: Parse()"); - try - { - /* - * Parse(String) - */ - Console.WriteLine("\nOverload: Parse(String)"); - Console.WriteLine(ParseMethod.ParseWithStringInputParameter(DATESTRING)); /* Output: 1/15/2023 2:21:37 AM */ - - /* - * Parse(String, IFormatProvider) - */ - Console.WriteLine("\nOverload: Parse(String, IFormatProvider)"); - Console.WriteLine(ParseMethod.ParseWithStringAndFormatProviderInputParameters(DATESTRING, CULTURE_FR)); /* Output: 15/1/2023 2:21:37 AM */ - - /* - * Parse(String, IFormatProvider, DateTimeStyles) - */ - Console.WriteLine("\nParse(String, IFormatProvider, DateTimeStyles)"); - Console.WriteLine(ParseMethod.ParseWithStringAndFormatProviderAndDateTimeStylesInputParameters(DATESTRING, CULTURE_FR, STYLE_ASSUME_UNIVERSAL)); /* Output: 15/01/2023 1:21:37 PM */ - - /* - * Parse(ReadOnlySpan, IFormatProvider) - */ - Console.WriteLine("\nParse(ReadOnlySpan, IFormatProvider)"); - Console.WriteLine(ParseMethod.ParseWithSpanAndFormatProviderInputParameters(DATESTRING, CULTURE_FR)); /* Output: 15/01/2023 2:21:37 AM */ - - /* - * Parse(ReadOnlySpan, IFormatProvider, DateTimeStyles) - */ - Console.WriteLine("\nParse(ReadOnlySpan, IFormatProvider, DateTimeStyles)"); - Console.WriteLine(ParseMethod.ParseWithSpanAndFormatProviderAndDateTimeStylesInputParameters(DATESTRING, CULTURE_FR, STYLE_ASSUME_UNIVERSAL)); /* Output: 15 / 01 / 2023 1:21:37 PM */ - } - catch (ArgumentNullException e) - { - Console.WriteLine(e.Message); - } - catch (ArgumentException e) - { - Console.WriteLine(e.Message); - } - catch (FormatException e) - { - Console.WriteLine(e.Message); - } - - #endregion - - #region TryParse overloads - - /* - * TryParse(String, DateTime) - */ - Console.WriteLine("\nOverload: TryParse(String, DateTime)"); - TryParseMethod.TryParseWithStringInputParameter(DATESTRING_MMDDYYYY, out var parsedDate); - Console.WriteLine(parsedDate); /* Output: 1/15/2023 12:00:00 AM */ - - /* - * TryParse(String, IFormatProvider, DateTime) - */ - Console.WriteLine("\nOverload: TryParse(String, IFormatProvider, DateTime)"); - TryParseMethod.TryParseWithStringAndFormatProviderInputParameters(DATESTRING_DDMMYYYY, CULTURE_EN_GB, out parsedDate); - Console.WriteLine(parsedDate); /* Output: 15/01/2023 12:00:00 AM */ - - /* - * TryParse(String, IFormatProvider, DateTimeStyles, DateTime) - */ - Console.WriteLine("\nOverload: TryParse(String, IFormatProvider, DateTimeStyles, DateTime)"); - TryParseMethod.TryParseWithStringAndFormatProviderAndDateTimeStylesInputParameters(DATESTRING_EST_TIMEZONE, CULTURE_EN_GB, STYLE_ADJUST_TO_UNIVERSAL, out parsedDate); - Console.WriteLine(parsedDate); /* Output: 15/01/2023 7:21:37 PM */ - - /* - * TryParse(ReadOnlySpan, DateTime) - */ - Console.WriteLine("\nOverload: TryParse(ReadOnlySpan, DateTime)"); - TryParseMethod.TryParseWithSpanInputParameter(DATESTRING_MMDDYYYY, out parsedDate); - Console.WriteLine(parsedDate); /* Output: 1/15/2023 12:00:00 AM */ - - /* - * TryParse(ReadOnlySpan, IFormatProvider, DateTime) - */ - Console.WriteLine("\nOverload: TryParse(ReadOnlySpan, IFormatProvider, DateTime)"); - TryParseMethod.TryParseWithSpanAndFormatProviderInputParameters(DATESTRING_DDMMYYYY, CULTURE_EN_GB, out parsedDate); - Console.WriteLine(parsedDate); /* Output: 15/01/2023 12:00:00 AM */ - - /* - * TryParse(ReadOnlySpan, IFormatProvider, DateTimeStyles, DateTime) - */ - Console.WriteLine("\nOverload: TryParse(ReadOnlySpan, IFormatProvider, DateTimeStyles, DateTime)"); - TryParseMethod.TryParseWithSpanAndFormatProviderAndDateTimeStylesInputParameters(DATESTRING_DDMMYYYY, CULTURE_EN_GB, STYLE_NONE, out parsedDate); - Console.WriteLine(parsedDate); /* Output: 15/01/2023 12:00:00 AM */ - - #endregion - - #region ParseExact - /* - * ParseExact(String, String, IFormatProvider) - */ - Console.WriteLine("\nOverload: ParseExact(String, String, IFormatProvider)"); - Console.WriteLine(ParseExactMethod.ParseExactWithStringAndStringAndFormatProviderInputParameters(DATESTRING_DDMYYYY_HHMMSS, DATEFORMAT_DDMYYYY_HHMMSS, CULTURE_FR)); /* Output: 15/01/2023 10:12:12 AM */ - - /* - * ParseExact(String, String, IFormatProvider, DateTimeStyles) - */ - Console.WriteLine("\nOverload: ParseExact(String, String, IFormatProvider, DateTimeStyles)"); - Console.WriteLine(ParseExactMethod.ParseExactWithStringAndStringAndFormatProviderAndDateTimeStylesInputParameters(DATESTRING_YYYYMMDD_ROUNDTRIP, DATEFORMAT_ROUNDTRIP, CULTURE_FR, STYLE_ROUND_TRIP)); /* Output: 15/01/2023 2:12:12 PM */ - - /* - * ParseExact(ReadOnlySpan, ReadOnlySpan, IFormatProvider, DateTimeStyles) - */ - Console.WriteLine("\nOverload: ParseExact(ReadOnlySpan, ReadOnlySpan, IFormatProvider, DateTimeStyles)"); - Console.WriteLine(ParseExactMethod.ParseExactWithSpanAndSpanAndFormatProviderAndDateTimeStylesInputParameters(DATESTRING_YYYYMMDD_ROUNDTRIP, DATEFORMAT_ROUNDTRIP, CULTURE_FR, STYLE_ROUND_TRIP)); /* Output: 1/15/2023 2:12:12 PM */ - - /* - * ParseExact(String, String[], IFormatProvider, DateTimeStyles) - */ - Console.WriteLine("\nOverload: ParseExact(String, String[], IFormatProvider, DateTimeStyles)"); - var resultParseExactKeyValuePair = ParseExactMethod.ParseExactWithStringAndStringArrayAndFormatProviderAndDateTimeStylesInputParameters(_dateStringKeyValuePairs, _dateFormats, _cultureInvariant, STYLE_NONE); - foreach (var result in resultParseExactKeyValuePair) - { - Console.WriteLine(result.Value); - } - - /* - * ParseExact(ReadOnlySpan, String[], IFormatProvider, DateTimeStyles) - */ - Console.WriteLine("\nOverload: ParseExact(ReadOnlySpan, String[], IFormatProvider, DateTimeStyles)"); - resultParseExactKeyValuePair = ParseExactMethod.ParseExactWithSpanAndStringArrayAndFormatProviderAndDateTimeStylesInputParameters(_dateStringKeyValuePairs, _dateFormats, _cultureInvariant, STYLE_NONE); - foreach (var result in resultParseExactKeyValuePair) - { - Console.WriteLine(result.Value); - } - - #endregion - - #region TryParseExact - - /* - * TryParseExact(String, String, IFormatProvider, DateTimeStyles, DateTime) - */ - Console.WriteLine("\nOverload: TryParseExact(String, String, IFormatProvider, DateTimeStyles, DateTime)"); - TryParseExactMethod.TryParseExactWithStringAndStringAndFormatProviderAndDateTimeStylesInputParameters(DATESTRING_DD_MM_YYYY, DATEFORMAT_DD_MM_YYYY, _cultureInvariant, STYLE_NONE, out parsedDate); - Console.WriteLine(parsedDate); /* Output: 1/15/2023 12:00:00 AM */ - - /* - * TryParseExact(ReadOnlySpan, ReadOnlySpan, IFormatProvider, DateTimeStyles, DateTime) - */ - Console.WriteLine("\nOverload: TryParseExact(ReadOnlySpan, ReadOnlySpan, IFormatProvider, DateTimeStyles, DateTime)"); - TryParseExactMethod.TryParseExactWithSpanAndSpanAndFormatProviderAndDateTimeStylesInputParameters(DATESTRING_DD_MM_YYYY, DATEFORMAT_DD_MM_YYYY, _cultureInvariant, STYLE_NONE, out parsedDate); - Console.WriteLine(parsedDate); /* Output: 1/15/2023 12:00:00 AM */ - - /* - * TryParseExact(String, String[], IFormatProvider, DateTimeStyles, DateTime) - */ - Console.WriteLine("\nOverload: TryParseExact(String, String[], IFormatProvider, DateTimeStyles, DateTime)"); - var resultTryParseExacKeyValuePair = TryParseExactMethod.TryParseExactWithStringAndStringArrayAndFormatProviderAndDateTimeStylesInputParameters(_dateStringKeyValuePairs, _dateFormats, _cultureInvariant, STYLE_NONE); - foreach (var result in resultTryParseExacKeyValuePair) - { - Console.WriteLine(result.Value); - } - - /* - * TryParseExact(ReadOnlySpan, String[], IFormatProvider, DateTimeStyles, DateTime) - */ - Console.WriteLine("\nOverload: TryParseExact(ReadOnlySpan, String[], IFormatProvider, DateTimeStyles, DateTime)"); - resultTryParseExacKeyValuePair = TryParseExactMethod.TryParseExactWithSpanAndStringArrayAndFormatProviderAndDateTimeStylesInputParameters(_dateStringKeyValuePairs, _dateFormats, _cultureInvariant, STYLE_NONE); - foreach (var result in resultTryParseExacKeyValuePair) - { - Console.WriteLine(result.Value); - } - - #endregion - - Console.ReadKey(); - } - } -} \ No newline at end of file + Console.WriteLine(e.Message); +} + +#endregion + +#region TryParse overloads + +/* + * TryParse(String, DateTime) + */ +Console.WriteLine("\nOverload: TryParse(String, DateTime)"); +TryParseMethod.TryParseWithStringInputParameter(DATESTRING_MMDDYYYY, out var parsedDate); +Console.WriteLine(parsedDate); /* Output under en-US: 1/15/2023 12:00:00 AM */ + +/* + * TryParse(String, IFormatProvider, DateTime) + */ +Console.WriteLine("\nOverload: TryParse(String, IFormatProvider, DateTime)"); +TryParseMethod.TryParseWithStringAndFormatProviderInputParameters(DATESTRING_DDMMYYYY, CULTURE_EN_GB, out parsedDate); +Console.WriteLine(parsedDate); /* Output under en-US: 1/15/2023 12:00:00 AM */ + +/* + * TryParse(String, IFormatProvider, DateTimeStyles, DateTime) + */ +Console.WriteLine("\nOverload: TryParse(String, IFormatProvider, DateTimeStyles, DateTime)"); +TryParseMethod.TryParseWithStringAndFormatProviderAndDateTimeStylesInputParameters(DATESTRING_EST_TIMEZONE, CULTURE_EN_GB, STYLE_ADJUST_TO_UNIVERSAL, out parsedDate); +Console.WriteLine(parsedDate); /* Output under en-US: 1/15/2023 7:21:37 PM */ + +/* + * TryParse(ReadOnlySpan, DateTime) + */ +Console.WriteLine("\nOverload: TryParse(ReadOnlySpan, DateTime)"); +TryParseMethod.TryParseWithSpanInputParameter(DATESTRING_MMDDYYYY, out parsedDate); +Console.WriteLine(parsedDate); /* Output under en-US: 1/15/2023 12:00:00 AM */ + +/* + * TryParse(ReadOnlySpan, IFormatProvider, DateTime) + */ +Console.WriteLine("\nOverload: TryParse(ReadOnlySpan, IFormatProvider, DateTime)"); +TryParseMethod.TryParseWithSpanAndFormatProviderInputParameters(DATESTRING_DDMMYYYY, CULTURE_EN_GB, out parsedDate); +Console.WriteLine(parsedDate); /* Output under en-US: 1/15/2023 12:00:00 AM */ + +/* + * TryParse(ReadOnlySpan, IFormatProvider, DateTimeStyles, DateTime) + */ +Console.WriteLine("\nOverload: TryParse(ReadOnlySpan, IFormatProvider, DateTimeStyles, DateTime)"); +TryParseMethod.TryParseWithSpanAndFormatProviderAndDateTimeStylesInputParameters(DATESTRING_DDMMYYYY, CULTURE_EN_GB, STYLE_NONE, out parsedDate); +Console.WriteLine(parsedDate); /* Output under en-US: 1/15/2023 12:00:00 AM */ + +#endregion + +#region ParseExact +/* + * ParseExact(String, String, IFormatProvider) + */ +Console.WriteLine("\nOverload: ParseExact(String, String, IFormatProvider)"); +Console.WriteLine(ParseExactMethod.ParseExactWithStringAndStringAndFormatProviderInputParameters(DATESTRING_DDMYYYY_HHMMSS, DATEFORMAT_DDMYYYY_HHMMSS, CULTURE_FR)); /* Output under en-US: 1/15/2023 10:12:12 AM */ + +/* + * ParseExact(String, String, IFormatProvider, DateTimeStyles) + */ +Console.WriteLine("\nOverload: ParseExact(String, String, IFormatProvider, DateTimeStyles)"); +Console.WriteLine(ParseExactMethod.ParseExactWithStringAndStringAndFormatProviderAndDateTimeStylesInputParameters(DATESTRING_YYYYMMDD_ROUNDTRIP, DATEFORMAT_ROUNDTRIP, CULTURE_FR, STYLE_ROUND_TRIP)); /* Output under en-US: 1/15/2023 2:12:12 PM */ + +/* + * ParseExact(ReadOnlySpan, ReadOnlySpan, IFormatProvider, DateTimeStyles) + */ +Console.WriteLine("\nOverload: ParseExact(ReadOnlySpan, ReadOnlySpan, IFormatProvider, DateTimeStyles)"); +Console.WriteLine(ParseExactMethod.ParseExactWithSpanAndSpanAndFormatProviderAndDateTimeStylesInputParameters(DATESTRING_YYYYMMDD_ROUNDTRIP, DATEFORMAT_ROUNDTRIP, CULTURE_FR, STYLE_ROUND_TRIP)); /* Output under en-US: 1/15/2023 2:12:12 PM */ + +/* + * ParseExact(String, String[], IFormatProvider, DateTimeStyles) + */ +Console.WriteLine("\nOverload: ParseExact(String, String[], IFormatProvider, DateTimeStyles)"); +var resultParseExactKeyValuePair = ParseExactMethod.ParseExactWithStringAndStringArrayAndFormatProviderAndDateTimeStylesInputParameters(dateStringKeyValuePairs, dateFormats, cultureInvariant, STYLE_NONE); +foreach (var result in resultParseExactKeyValuePair) +{ + Console.WriteLine(result.Value); +} + +/* + * ParseExact(ReadOnlySpan, String[], IFormatProvider, DateTimeStyles) + */ +Console.WriteLine("\nOverload: ParseExact(ReadOnlySpan, String[], IFormatProvider, DateTimeStyles)"); +resultParseExactKeyValuePair = ParseExactMethod.ParseExactWithSpanAndStringArrayAndFormatProviderAndDateTimeStylesInputParameters(dateStringKeyValuePairs, dateFormats, cultureInvariant, STYLE_NONE); +foreach (var result in resultParseExactKeyValuePair) +{ + Console.WriteLine(result.Value); +} + +#endregion + +#region TryParseExact + +/* + * TryParseExact(String, String, IFormatProvider, DateTimeStyles, DateTime) + */ +Console.WriteLine("\nOverload: TryParseExact(String, String, IFormatProvider, DateTimeStyles, DateTime)"); +TryParseExactMethod.TryParseExactWithStringAndStringAndFormatProviderAndDateTimeStylesInputParameters(DATESTRING_DD_MM_YYYY, DATEFORMAT_DD_MM_YYYY, cultureInvariant, STYLE_NONE, out parsedDate); +Console.WriteLine(parsedDate); /* Output under en-US: 1/15/2023 12:00:00 AM */ + +/* + * TryParseExact(ReadOnlySpan, ReadOnlySpan, IFormatProvider, DateTimeStyles, DateTime) + */ +Console.WriteLine("\nOverload: TryParseExact(ReadOnlySpan, ReadOnlySpan, IFormatProvider, DateTimeStyles, DateTime)"); +TryParseExactMethod.TryParseExactWithSpanAndSpanAndFormatProviderAndDateTimeStylesInputParameters(DATESTRING_DD_MM_YYYY, DATEFORMAT_DD_MM_YYYY, cultureInvariant, STYLE_NONE, out parsedDate); +Console.WriteLine(parsedDate); /* Output under en-US: 1/15/2023 12:00:00 AM */ + +/* + * TryParseExact(String, String[], IFormatProvider, DateTimeStyles, DateTime) + */ +Console.WriteLine("\nOverload: TryParseExact(String, String[], IFormatProvider, DateTimeStyles, DateTime)"); +var resultTryParseExacKeyValuePair = TryParseExactMethod.TryParseExactWithStringAndStringArrayAndFormatProviderAndDateTimeStylesInputParameters(dateStringKeyValuePairs, dateFormats, cultureInvariant, STYLE_NONE); +foreach (var result in resultTryParseExacKeyValuePair) +{ + Console.WriteLine(result.Value); +} + +/* + * TryParseExact(ReadOnlySpan, String[], IFormatProvider, DateTimeStyles, DateTime) + */ +Console.WriteLine("\nOverload: TryParseExact(ReadOnlySpan, String[], IFormatProvider, DateTimeStyles, DateTime)"); +resultTryParseExacKeyValuePair = TryParseExactMethod.TryParseExactWithSpanAndStringArrayAndFormatProviderAndDateTimeStylesInputParameters(dateStringKeyValuePairs, dateFormats, cultureInvariant, STYLE_NONE); +foreach (var result in resultTryParseExacKeyValuePair) +{ + Console.WriteLine(result.Value); +} + +#endregion diff --git a/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/TryParseExactMethod.cs b/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/TryParseExactMethod.cs index d1a2b7dcdb..696aa3890d 100644 --- a/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/TryParseExactMethod.cs +++ b/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/TryParseExactMethod.cs @@ -1,39 +1,38 @@ using System.Globalization; -namespace ParsingDateTimeInCSharp -{ - public static class TryParseExactMethod - { - public static bool TryParseExactWithStringAndStringAndFormatProviderAndDateTimeStylesInputParameters(string dateString, string format, CultureInfo cultureInfo, DateTimeStyles dateTimeStyles, out DateTime parsedDate) - => DateTime.TryParseExact(dateString, format, cultureInfo, dateTimeStyles, out parsedDate); +namespace ParsingDateTimeInCSharp; - public static bool TryParseExactWithSpanAndSpanAndFormatProviderAndDateTimeStylesInputParameters(string dateString, string format, CultureInfo cultureInfo, DateTimeStyles dateTimeStyles, out DateTime parsedDate) - => DateTime.TryParseExact(dateString.AsSpan(), format.AsSpan(), cultureInfo, dateTimeStyles, out parsedDate); +public static class TryParseExactMethod +{ + public static bool TryParseExactWithStringAndStringAndFormatProviderAndDateTimeStylesInputParameters(string dateString, string format, CultureInfo cultureInfo, DateTimeStyles dateTimeStyles, out DateTime parsedDate) + => DateTime.TryParseExact(dateString, format, cultureInfo, dateTimeStyles, out parsedDate); - public static Dictionary TryParseExactWithStringAndStringArrayAndFormatProviderAndDateTimeStylesInputParameters(Dictionary dateStrings, string[] formats, CultureInfo cultureInfo, DateTimeStyles dateTimeStyles) - { - var result = new Dictionary(); + public static bool TryParseExactWithSpanAndSpanAndFormatProviderAndDateTimeStylesInputParameters(string dateString, string format, CultureInfo cultureInfo, DateTimeStyles dateTimeStyles, out DateTime parsedDate) + => DateTime.TryParseExact(dateString.AsSpan(), format.AsSpan(), cultureInfo, dateTimeStyles, out parsedDate); - foreach (var format in formats) - { - var dateString = dateStrings[format]; - result.Add(dateString, (DateTime.TryParseExact(dateString, formats, cultureInfo, dateTimeStyles, out var parsedDate), parsedDate)); - } + public static Dictionary TryParseExactWithStringAndStringArrayAndFormatProviderAndDateTimeStylesInputParameters(Dictionary dateStrings, string[] formats, CultureInfo cultureInfo, DateTimeStyles dateTimeStyles) + { + var result = new Dictionary(); - return result; + foreach (var format in formats) + { + var dateString = dateStrings[format]; + result.Add(dateString, (DateTime.TryParseExact(dateString, formats, cultureInfo, dateTimeStyles, out var parsedDate), parsedDate)); } - public static Dictionary TryParseExactWithSpanAndStringArrayAndFormatProviderAndDateTimeStylesInputParameters(Dictionary dateStrings, string[] formats, CultureInfo cultureInfo, DateTimeStyles dateTimeStyles) - { - var result = new Dictionary(); + return result; + } - foreach (var format in formats) - { - var dateSpan = dateStrings[format].AsSpan(); - result.Add(dateStrings[format], (DateTime.TryParseExact(dateSpan, formats, cultureInfo, dateTimeStyles, out var parsedDate), parsedDate)); - } + public static Dictionary TryParseExactWithSpanAndStringArrayAndFormatProviderAndDateTimeStylesInputParameters(Dictionary dateStrings, string[] formats, CultureInfo cultureInfo, DateTimeStyles dateTimeStyles) + { + var result = new Dictionary(); - return result; + foreach (var format in formats) + { + var dateSpan = dateStrings[format].AsSpan(); + result.Add(dateStrings[format], (DateTime.TryParseExact(dateSpan, formats, cultureInfo, dateTimeStyles, out var parsedDate), parsedDate)); } + + return result; } } diff --git a/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/TryParseMethod.cs b/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/TryParseMethod.cs index 1768fb78a9..5feb1bb00d 100644 --- a/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/TryParseMethod.cs +++ b/dotnet-datetime/ParsingDateTimeInCSharp/ParsingDateTimeInCSharp/TryParseMethod.cs @@ -1,25 +1,24 @@ using System.Globalization; -namespace ParsingDateTimeInCSharp +namespace ParsingDateTimeInCSharp; + +public static class TryParseMethod { - public static class TryParseMethod - { - public static bool TryParseWithStringInputParameter(string dateString, out DateTime parsedDate) - => DateTime.TryParse(dateString, out parsedDate); + public static bool TryParseWithStringInputParameter(string dateString, out DateTime parsedDate) + => DateTime.TryParse(dateString, out parsedDate); - public static bool TryParseWithStringAndFormatProviderInputParameters(string dateString, string culture, out DateTime parsedDate) - => DateTime.TryParse(dateString, new CultureInfo(culture), out parsedDate); + public static bool TryParseWithStringAndFormatProviderInputParameters(string dateString, string culture, out DateTime parsedDate) + => DateTime.TryParse(dateString, new CultureInfo(culture), out parsedDate); - public static bool TryParseWithStringAndFormatProviderAndDateTimeStylesInputParameters(string dateString, string culture, DateTimeStyles dateTimeStyles, out DateTime parsedDate) - => DateTime.TryParse(dateString, new CultureInfo(culture), dateTimeStyles, out parsedDate); + public static bool TryParseWithStringAndFormatProviderAndDateTimeStylesInputParameters(string dateString, string culture, DateTimeStyles dateTimeStyles, out DateTime parsedDate) + => DateTime.TryParse(dateString, new CultureInfo(culture), dateTimeStyles, out parsedDate); - public static bool TryParseWithSpanInputParameter(string dateString, out DateTime parsedDate) - => DateTime.TryParse(dateString.AsSpan(), out parsedDate); + public static bool TryParseWithSpanInputParameter(string dateString, out DateTime parsedDate) + => DateTime.TryParse(dateString.AsSpan(), out parsedDate); - public static bool TryParseWithSpanAndFormatProviderInputParameters(string dateString, string culture, out DateTime parsedDate) - => DateTime.TryParse(dateString.AsSpan(), new CultureInfo(culture), out parsedDate); + public static bool TryParseWithSpanAndFormatProviderInputParameters(string dateString, string culture, out DateTime parsedDate) + => DateTime.TryParse(dateString.AsSpan(), new CultureInfo(culture), out parsedDate); - public static bool TryParseWithSpanAndFormatProviderAndDateTimeStylesInputParameters(string dateString, string culture, DateTimeStyles dateTimeStyles, out DateTime parsedDate) - => DateTime.TryParse(dateString.AsSpan(), new CultureInfo(culture), dateTimeStyles, out parsedDate); - } + public static bool TryParseWithSpanAndFormatProviderAndDateTimeStylesInputParameters(string dateString, string culture, DateTimeStyles dateTimeStyles, out DateTime parsedDate) + => DateTime.TryParse(dateString.AsSpan(), new CultureInfo(culture), dateTimeStyles, out parsedDate); }