-
Notifications
You must be signed in to change notification settings - Fork 4.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
new trimmer feature System.TimeZoneInfo.Invariant #111215
base: main
Are you sure you want to change the base?
Conversation
Tagging subscribers to this area: @dotnet/area-system-globalization |
Will it be acceptable to have |
It will report UTC. Also this behavior already existed before this PR, here I'm just removing the ability to load TZ data from file system, when |
Thanks. I am not sure my question is answered :-) I am not questioning the PR more than questioning behavior. I guess users haven't run into this yet to report it. Returning UTC time when having TZ settings different than UTC is questionable. Maybe it is acceptable to the browser (especially servers) but wanted to know how we validated this assumption. |
src/tools/illink/src/ILLink.Tasks/build/Microsoft.NET.ILLink.targets
Outdated
Show resolved
Hide resolved
This is not how it works. You would not be able to change to non-UTC timezone. Let me show you: given code Console.WriteLine($"TimeZoneInfo.Local is {TimeZoneInfo.Local}");
Console.WriteLine($"DateTime.UtcNow is {DateTime.UtcNow}");
Console.WriteLine($"DateTime.Now is {DateTime.Now}");
var start = DateTime.UtcNow;
var timezonesCount = TimeZoneInfo.GetSystemTimeZones().Count;
await Delay(100);
var end = DateTime.UtcNow;
Console.WriteLine($"Found {timezonesCount} timezones in the TZ database in {end - start}");
TimeZoneInfo utc = TimeZoneInfo.FindSystemTimeZoneById("UTC");
Console.WriteLine($"{utc.DisplayName} BaseUtcOffset is {utc.BaseUtcOffset}");
try
{
TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("Asia/Tokyo");
Console.WriteLine($"{tst.DisplayName} BaseUtcOffset is {tst.BaseUtcOffset}");
}
catch (TimeZoneNotFoundException tznfe)
{
Console.WriteLine($"Could not find Asia/Tokyo: {tznfe.Message}");
} At 12:19 in Prague, you will get following output
|
The On the browser "operating system" we don't have TZ database pre-installed and so we are bundling it with each application. It's 300KB of download and some CPU time before the runtime can start. That's a lot for a web app, especially if your business logic is not about dates/times/calendars. Before this PR the I feel quite safe to make this change for the browser target. @steveisok is this how it works for iOS too ? Can I assume people are not shipping custom |
We don't ship anything custom on iOS or Android as we rely on whatever they do. |
b5ce502
to
48ccc77
Compare
- add new System.Runtime.InvariantTimezone.Tests.csproj
src/libraries/System.Private.CoreLib/src/ILLink/ILLink.Substitutions.Shared.xml
Outdated
Show resolved
Hide resolved
Co-authored-by: Sven Boemer <sbomer@gmail.com>
# Conflicts: # src/libraries/System.Runtime/tests/System.Runtime.Tests/System/TimeZoneInfoTests.cs
src/libraries/System.Private.CoreLib/src/System/TimeZoneInfo.Unix.Android.cs
Show resolved
Hide resolved
src/libraries/System.Private.CoreLib/src/System/TimeZoneInfo.Unix.NonAndroid.cs
Outdated
Show resolved
Hide resolved
src/libraries/System.Private.CoreLib/src/System/TimeZoneInfo.Win32.cs
Outdated
Show resolved
Hide resolved
src/libraries/System.Private.CoreLib/src/System/TimeZoneInfo.Win32.cs
Outdated
Show resolved
Hide resolved
src/libraries/System.Private.CoreLib/src/System/TimeZoneInfo.Win32.cs
Outdated
Show resolved
Hide resolved
…in32.cs Co-authored-by: Alexander Köplinger <alex.koeplinger@outlook.com>
…in32.cs Co-authored-by: Alexander Köplinger <alex.koeplinger@outlook.com>
…in32.cs Co-authored-by: Alexander Köplinger <alex.koeplinger@outlook.com>
…nix.NonAndroid.cs Co-authored-by: Alexander Köplinger <alex.koeplinger@outlook.com>
@sbomer @MichalStrehovsky @tarekgh do you have further questions or feedback ? |
value = null; | ||
e = new TimeZoneNotFoundException(SR.Format(SR.InvalidTimeZone_InvalidId, id)); | ||
return TimeZoneInfoResult.TimeZoneNotFoundException; | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should add assert here that never reach this code when Invariant is true.
cachedData._systemTimeZones ??= new Dictionary<string, TimeZoneInfo>(StringComparer.OrdinalIgnoreCase) | ||
{ | ||
{ UtcId, s_utcTimeZone } | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should this get moved inside the Invariant block?
Could the UTC get enumerated again in GetTimeZoneIds()?
@@ -72,6 +72,11 @@ private static TimeZoneInfoResult TryGetTimeZoneFromLocalMachineCore(string id, | |||
value = null; | |||
e = null; | |||
|
|||
if (Invariant) | |||
{ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should assert here not having Invariant is true?
@@ -403,6 +413,11 @@ private static bool CompareTimeZoneFile(string filePath, byte[] buffer, byte[] r | |||
/// </summary> | |||
private static string FindTimeZoneId(byte[] rawData) | |||
{ | |||
if (Invariant) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
{ | ||
{ UtcId, s_utcTimeZone } | ||
}; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
move inside Invariant block?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks @pavelsavara
I added a few minor comments. LGTM otherwise
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thank you!
@@ -0,0 +1,29 @@ | |||
<Project Sdk="Microsoft.NET.Sdk"> | |||
<PropertyGroup> | |||
<TargetFrameworks>$(NetCoreAppCurrent)-windows;$(NetCoreAppCurrent)-unix;$(NetCoreAppCurrent)-android;$(NetCoreAppCurrent)-browser;$(NetCoreAppCurrent)-osx;$(NetCoreAppCurrent)-ios;$(NetCoreAppCurrent)-tvos</TargetFrameworks> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can this be <TargetFramework>$(NetCoreAppCurrent)</TargetFramework>
?
Is there a platform where we don't respect this? If so, why?
Motivation: when
TryGetLocalTzFile
is included it brings dependency toSystem.IO.File
and its dependencies.System.TimeZoneInfo.Invariant
triggered by existing<InvariantTimezone>true</InvariantTimezone>
System.TimeZoneInfo.Invariant
getter also driven byDOTNET_SYSTEM_TIMEZONE_INVARIANT
env variableILLink.Substitutions.LegacyJsInterop.xml
Together with dotnet/sdk#45792
<InvariantTimezone>true</InvariantTimezone>
is pre-existing feature.After discussion below the implementation was unified to other platforms.
Explanation of the feature in comment below.