Skip to content
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

Merged
merged 20 commits into from
Jan 28, 2025

Conversation

pavelsavara
Copy link
Member

@pavelsavara pavelsavara commented Jan 8, 2025

Motivation: when TryGetLocalTzFile is included it brings dependency to System.IO.File and its dependencies.

  • new trimmer feature System.TimeZoneInfo.Invariant triggered by existing <InvariantTimezone>true</InvariantTimezone>
    • breaking change: it will prevent loading TZ info files from FS
  • new System.TimeZoneInfo.Invariant getter also driven by DOTNET_SYSTEM_TIMEZONE_INVARIANT env variable
  • cleanup ILLink.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.

@pavelsavara pavelsavara added arch-wasm WebAssembly architecture area-System.Globalization size-reduction Issues impacting final app size primary for size sensitive workloads labels Jan 8, 2025
@pavelsavara pavelsavara added this to the 10.0.0 milestone Jan 8, 2025
@pavelsavara pavelsavara self-assigned this Jan 8, 2025
Copy link
Contributor

Tagging subscribers to this area: @dotnet/area-system-globalization
See info in area-owners.md if you want to be subscribed.

@tarekgh
Copy link
Member

tarekgh commented Jan 8, 2025

Will it be acceptable to have DateTime.Now report wrong time when the invariant mode is enabled?

@pavelsavara
Copy link
Member Author

Will it be acceptable to have DateTime.Now report wrong time when the invariant mode is enabled?

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 InvariantTimezone is true.

@pavelsavara pavelsavara requested a review from ilonatommy January 8, 2025 22:12
@tarekgh
Copy link
Member

tarekgh commented Jan 8, 2025

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 InvariantTimezone is true.

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.
Maybe the explicit opt-in switch introduced here is better as users will explicitly enable and understand the consequences.

@pavelsavara
Copy link
Member Author

Returning UTC time when having TZ settings different than UTC is questionable.

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

TimeZoneInfo.Local is (UTC) UTC
DateTime.UtcNow is 1/9/2025 11:19:52 AM
DateTime.Now is 1/9/2025 11:19:52 AM
Found 0 timezones in the TZ database in 00:00:00.1200000
(UTC) UTC BaseUtcOffset is 00:00:00
Could not find Asia/Tokyo: The time zone ID 'Asia/Tokyo' was not found on the local computer.

@pavelsavara
Copy link
Member Author

The <InvariantTimezone>true</InvariantTimezone> feature is opt-in and it means: "I don't care for timezones, please make the application as small as possible".

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 <InvariantTimezone>true</InvariantTimezone> would just stop shipping the data. But you would be able to ship your own and store it into emscripten virtual file system yourself. There are probably nobody in the world that knew this was possible.

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 TZDIR there at the same time when they set <InvariantTimezone>true</InvariantTimezone> ?

@pavelsavara pavelsavara marked this pull request as ready for review January 9, 2025 13:16
@pavelsavara pavelsavara requested review from steveisok and removed request for steveisok January 9, 2025 13:16
@steveisok
Copy link
Member

@steveisok is this how it works for iOS too ?

We don't ship anything custom on iOS or Android as we rely on whatever they do.

@pavelsavara pavelsavara force-pushed the browser_trim_timezones branch from b5ce502 to 48ccc77 Compare January 9, 2025 17:37
@pavelsavara pavelsavara changed the title [browser] new trimmer feature System.TimeZoneInfo.Invariant [WASM] new trimmer feature System.TimeZoneInfo.Invariant Jan 9, 2025
# Conflicts:
#	src/libraries/System.Runtime/tests/System.Runtime.Tests/System/TimeZoneInfoTests.cs
pavelsavara and others added 4 commits January 23, 2025 11:09
…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>
@pavelsavara pavelsavara changed the title [WASM] new trimmer feature System.TimeZoneInfo.Invariant new trimmer feature System.TimeZoneInfo.Invariant Jan 23, 2025
@pavelsavara pavelsavara removed the arch-wasm WebAssembly architecture label Jan 23, 2025
@pavelsavara
Copy link
Member Author

@sbomer @MichalStrehovsky @tarekgh do you have further questions or feedback ?

Copy link
Member

@tarekgh tarekgh left a 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

Copy link
Member

@sbomer sbomer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thank you!

@pavelsavara
Copy link
Member Author

/ba-g CI timeouts

@pavelsavara pavelsavara merged commit 10f0bbf into dotnet:main Jan 28, 2025
155 of 160 checks passed
@pavelsavara pavelsavara deleted the browser_trim_timezones branch January 28, 2025 09:41
grendello added a commit to grendello/runtime that referenced this pull request Jan 28, 2025
* main: (31 commits)
  Fix linux-x86 build (dotnet#111861)
  Add FrozenDictionary specialization for integers / enums (dotnet#111886)
  [SRM] Refactor reading from streams. (dotnet#111323)
  Sign the DAC and DBI during the build process instead of in separate steps (dotnet#111416)
  Removing Entry2MethodDesc as it is unnecessary (dotnet#111756)
  Cross Product for Vector2 and Vector4 (dotnet#111265)
  Handle unicode in absolute URI path for combine. (dotnet#111710)
  Drop RequiresProcessIsolation on mcc tests (dotnet#111887)
  [main] Update dependencies from dotnet/roslyn (dotnet#111691)
  new trimmer feature System.TimeZoneInfo.Invariant (dotnet#111215)
  [browser] reduce msbuild memory footprint (dotnet#111751)
  Add debugging checks for stack overflow tests failure (dotnet#111867)
  Localized file check-in by OneLocBuild Task: Build definition ID 679: Build ID 2629821 (dotnet#111884)
  Bump main to preview2 (dotnet#111882)
  Avoid generic virtual dispatch for frozen collections alternate lookup (dotnet#108732)
  Bump main versioning to preview1 (dotnet#111880)
  Switch OneLoc to main (dotnet#111872)
  Improve docs on building ILVerify (dotnet#111851)
  Update Debian version to 13 (dotnet#111768)
  win32: add fallback to environment vars for system folder (dotnet#109673)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area-System.Globalization size-reduction Issues impacting final app size primary for size sensitive workloads
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants