Ciao,
non ho capito bene se devi tenere disgiunta la lingua dal fuso orario.
Vuoi consentire ai tuoi utenti di selezionare l'italiano come lingua e un fuso orario diverso da quello che si usa in Italia (es. Pacific Standard Time)?
Se sìdovresti far selezionare all'utente uno dei valori che arrivano dal metodo TimeZoneInfo.GetSystemTimeZones();
Ecco un esempio che stampa id e nome per ciascuno. Tu ovviamente dovrai usare questi valori per costruire un menu a tendina.
var zones = TimeZoneInfo.GetSystemTimeZones();
foreach (var zone in zones)
{
Console.WriteLine(zone.DisplayName + " (" + zone.Id + ")");
}
Ecco alcuni esempi:
(UTC-02:00) Coordinated Universal Time-02 (UTC-02)
(UTC-02:00) Mid-Atlantic - Old (Mid-Atlantic Standard Time)
(UTC-01:00) Azores (Azores Standard Time)
(UTC-01:00) Cabo Verde Is. (Cape Verde Standard Time)
(UTC) Coordinated Universal Time (UTC)
(UTC+00:00) Dublin, Edinburgh, Lisbon, London (GMT Standard Time)
(UTC+00:00) Monrovia, Reykjavik (Greenwich Standard Time)
(UTC+00:00) Sao Tome (Sao Tome Standard Time)
(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna (W. Europe Standard Time)
(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague (Central Europe Standard Time)
Gli oggetti TimeZoneInfo tengono conto delle impostazioni di ora legale e quindi penso che siano indicati nel tuo scenario. Supponiamo che l'utente dal menu a tendina scelga:
(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna (W. Europe Standard Time)
Tu ti memorizzi l'ID del TimeZoneInfo selezionato sul record dell'utente, nel database. Cioè:
Quando gli devi mostrare i valori nel suo timezone, usi questo codice:
var utcDate1 = new DateTime(2019, 02, 01, 0, 0, 0, DateTimeKind.Utc); //Data UTC ottenuta dal DB
string timezone = "W. Europe Standard Time"; //Timezone ottenuto dal DB
TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById(timezone);
DateTime localDate1 = TimeZoneInfo.ConvertTimeFromUtc(utcDate1, timeZone);
Console.WriteLine(localDate1);
Verrà stampato un orario che tiene conto del fuso orario invernale (+01:00) dato che la data è in inverno. Se usi un'ora estiva, vedrai che verrà usato il fuso orario estivo (+02:00) come vedi in questo fiddle.
https://dotnetfiddle.net/eilGaOSe noHai provato semplicemente a impostare la Culture per la richiesta corrente come indicato qui?
https://www.aspitalia.com/script/1332/Gestire-Localizzazione-ASP.NET-Core.aspxciao,
Moreno
Modificato da BrightSoul il 26 settembre 2019 14:05 -