string dateString = ReadTextString();
// TODO determine if conformance modes should allow inexact date sting parsing
- if (!DateTimeOffset.TryParseExact(dateString, CborWriter.Rfc3339FormatString, null, DateTimeStyles.RoundtripKind, out DateTimeOffset result))
+ if (!DateTimeOffset.TryParseExact(dateString, CborWriter.Rfc3339FormatString, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out DateTimeOffset result))
{
throw new CborContentException(SR.Cbor_Reader_InvalidDateTimeEncoding);
}
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
+using System.Globalization;
using System.Numerics;
namespace System.Formats.Cbor
#else
value.Offset == TimeSpan.Zero ?
#endif // NET8_0_OR_GREATER
- value.UtcDateTime.ToString(Rfc3339FormatString) : // prefer 'Z' over '+00:00'
- value.ToString(Rfc3339FormatString);
+ value.UtcDateTime.ToString(Rfc3339FormatString, CultureInfo.InvariantCulture) : // prefer 'Z' over '+00:00'
+ value.ToString(Rfc3339FormatString, CultureInfo.InvariantCulture);
WriteTag(CborTag.DateTimeString);
WriteTextString(dateString);
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections.Generic;
+using System.Globalization;
using System.Linq;
using System.Numerics;
+using System.Threading;
+using Microsoft.DotNet.RemoteExecutor;
using Test.Cryptography;
using Xunit;
Assert.Equal(expectedValue.Offset, result.Offset);
}
+ [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
+ [ConditionalFact(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))]
+ public static void ReadDateTimeOffset_IsCultureInvariant()
+ {
+ // Regression test for https://github.com/dotnet/runtime/pull/92539
+ RemoteExecutor.Invoke(static () =>
+ {
+ DateTimeOffset expectedValue = DateTimeOffset.Parse("2020-04-09T14:31:21.3535941+01:00", CultureInfo.InvariantCulture);
+ byte[] data = "c07821323032302d30342d30395431343a33313a32312e333533353934312b30313a3030".HexToByteArray();
+
+ // Install a non-Gregorian calendar
+ var culture = new CultureInfo("he-IL");
+ culture.DateTimeFormat.Calendar = new HebrewCalendar();
+ Thread.CurrentThread.CurrentCulture = culture;
+
+ var reader = new CborReader(data);
+
+ DateTimeOffset result = reader.ReadDateTimeOffset();
+
+ Assert.Equal(CborReaderState.Finished, reader.PeekState());
+ Assert.Equal(expectedValue, result);
+ Assert.Equal(expectedValue.Offset, result.Offset);
+ }).Dispose();
+ }
+
[Theory]
[InlineData("c01a514b67b0")] // string datetime tag with unix time payload
public static void ReadDateTimeOffset_InvalidTagPayload_ShouldThrowCborContentException(string hexEncoding)
[Theory]
[InlineData("c07330392f30342f323032302031393a35313a3530")] // 0("09/04/2020 19:51:50")
[InlineData("c06e4c617374204368726973746d6173")] // 0("Last Christmas")
+ [InlineData("c07828d7aad7a922d7a42dd796272dd79822d7955431343a33313a32312e333533353934312b30313a3030")] // Non-Gregorian calendar date.
public static void ReadDateTimeOffset_InvalidDateString_ShouldThrowCborContentException(string hexEncoding)
{
byte[] encoding = hexEncoding.HexToByteArray();
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>$(NetCoreAppCurrent);$(NetFrameworkCurrent)</TargetFrameworks>
+ <IncludeRemoteExecutor>true</IncludeRemoteExecutor>
<nullable>enable</nullable>
<!-- Referenced assembly 'FsCheck' does not have a strong name.-->
<NoWarn>$(NoWarn);CS8002</NoWarn>
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections.Generic;
+using System.Globalization;
using System.Linq;
using System.Numerics;
+using System.Threading;
+using Microsoft.DotNet.RemoteExecutor;
using Test.Cryptography;
using Xunit;
AssertHelper.HexEqual(expectedHexEncoding.HexToByteArray(), encoding);
}
+ [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
+ [ConditionalFact(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))]
+ public static void WriteDateTimeOffset_IsCultureInvariant()
+ {
+ // Regression test for https://github.com/dotnet/runtime/pull/92539
+ RemoteExecutor.Invoke(static () =>
+ {
+ DateTimeOffset value = DateTimeOffset.Parse("2020-04-09T14:31:21.3535941+01:00", CultureInfo.InvariantCulture);
+ string expectedHexEncoding = "c07821323032302d30342d30395431343a33313a32312e333533353934312b30313a3030";
+
+ // Install a non-Gregorian calendar
+ var culture = new CultureInfo("he-IL");
+ culture.DateTimeFormat.Calendar = new HebrewCalendar();
+ Thread.CurrentThread.CurrentCulture = culture;
+
+ var writer = new CborWriter();
+
+ writer.WriteDateTimeOffset(value);
+
+ byte[] encoding = writer.Encode();
+ AssertHelper.HexEqual(expectedHexEncoding.HexToByteArray(), encoding);
+ }).Dispose();
+ }
+
[Theory]
[InlineData(1363896240, "c11a514b67b0")]
[InlineData(1586439081, "c11a5e8f23a9")]