Skip to content

Commit f196875

Browse files
tarekghstephentoub
andauthored
Fix DateTime.Parse with AssumeUniversal style option (#111729)
* Fix DateTime.Parse with AssumeUniversal style option * Apply suggestions from code review Co-authored-by: Stephen Toub <[email protected]> --------- Co-authored-by: Stephen Toub <[email protected]>
1 parent 7e8f0a5 commit f196875

File tree

2 files changed

+15
-13
lines changed

2 files changed

+15
-13
lines changed

src/libraries/System.Private.CoreLib/src/System/Globalization/DateTimeParse.cs

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3792,22 +3792,13 @@ private static bool CheckNewValue(scoped ref int currentValue, int newValue, cha
37923792

37933793
private static DateTime GetDateTimeNow(scoped ref DateTimeResult result, scoped ref DateTimeStyles styles)
37943794
{
3795-
if ((result.flags & ParseFlags.CaptureOffset) != 0)
3795+
if ((result.flags & (ParseFlags.CaptureOffset | ParseFlags.TimeZoneUsed)) == (ParseFlags.CaptureOffset | ParseFlags.TimeZoneUsed))
37963796
{
3797-
if ((result.flags & ParseFlags.TimeZoneUsed) != 0)
3798-
{
3799-
// use the supplied offset to calculate 'Now'
3800-
return new DateTime(DateTime.UtcNow.Ticks + result.timeZoneOffset.Ticks, DateTimeKind.Unspecified);
3801-
}
3802-
else if ((styles & DateTimeStyles.AssumeUniversal) != 0)
3803-
{
3804-
// assume the offset is Utc
3805-
return DateTime.UtcNow;
3806-
}
3797+
// use the supplied offset to calculate 'Now'
3798+
return new DateTime(DateTime.UtcNow.Ticks + result.timeZoneOffset.Ticks, DateTimeKind.Unspecified);
38073799
}
38083800

3809-
// assume the offset is Local
3810-
return DateTime.Now;
3801+
return (styles & DateTimeStyles.AssumeUniversal) != 0 ? DateTime.UtcNow : DateTime.Now;
38113802
}
38123803

38133804
private static bool CheckDefaultDateTime(scoped ref DateTimeResult result, scoped ref Calendar cal, DateTimeStyles styles)

src/libraries/System.Runtime/tests/System.Runtime.Tests/System/DateTimeTests.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2687,6 +2687,17 @@ public void TestRoundTrippingDateTimeAndFileTime()
26872687
Assert.Equal(now, roundTrippedDateTime);
26882688
}
26892689

2690+
[Fact]
2691+
public void TestParseTimeOnlyStringWithAssumeUtcOption()
2692+
{
2693+
DateTime utcNow1 = DateTime.UtcNow;
2694+
DateTime dt = DateTime.Parse("13:30", null, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal);
2695+
DateTime utcNow2 = DateTime.UtcNow;
2696+
2697+
// Ensure the parsed date part is in UTC.
2698+
Assert.InRange(dt.Date, utcNow1.Date, utcNow2.Date);
2699+
}
2700+
26902701
[Fact]
26912702
[PlatformSpecific(TestPlatforms.Windows)]
26922703
public void TestTimeSynchronizationWithTheSystem()

0 commit comments

Comments
 (0)