Sto memorizzando tutte le mie date nel formato UTC nel mio database. Chiedo all'utente il loro fuso orario e voglio usare il loro fuso orario più quello che ritengo sia il tempo del server per capire l'UTC per loro.Problemi di conversione del mio DateTime in UTC
Una volta ottenuto, desidero eseguire una ricerca per visualizzare l'intervallo nel database utilizzando la data UTC appena convertita.
ma ottengo sempre questa eccezione.
System.ArgumentException was unhandled by user code
Message="The conversion could not be completed because the
supplied DateTime did not have the Kind property set correctly.
For example, when the Kind property is DateTimeKind.Local,
the source time zone must be TimeZoneInfo.Local.
Parameter name: sourceTimeZone"
Non so perché sto ottenendo questo.
ho provato 2 modi
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(id);
// I also tried DateTime.UtcNow
DateTime now = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
var utc = TimeZoneInfo.ConvertTimeToUtc(now , zone);
questo non è riuscito quindi mi stanco
DateTime now = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
var utc = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(now,
ZoneId, TimeZoneInfo.Utc.Id);
Questo anche fallito entrambi con lo stesso errore. Che cosa sto facendo di sbagliato?
Modifica sarebbe questo lavoro?
DateTime localServerTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
TimeZoneInfo info = TimeZoneInfo.FindSystemTimeZoneById(id);
var usersTime = TimeZoneInfo.ConvertTime(localServerTime, info);
var utc = TimeZoneInfo.ConvertTimeToUtc(usersTime, userInfo);
Edit 2 @ Jon Skeet
Ya Stavo solo pensando che io non potrei nemmeno bisogno di fare tutto questo. Le cose del tempo mi confondono in questo momento, ecco perché il post potrebbe non essere chiaro come dovrebbe essere. Non so mai cosa diavolo DateTime.Now sta ottenendo (ho provato a cambiare il mio fuso orario in un altro fuso orario e ha continuato a ottenere il mio fuso orario locale).
Questo è quello che volevo fare. L'utente arriva sul sito aggiunge un avviso e ora viene salvato come utc (prima era DateTime.Ora qualcuno suggeriva di memorizzare tutto UTC).
Quindi, prima che un utente arrivasse al mio sito e dipendesse dal mio server di hosting, potrebbe essere il giorno successivo. Quindi, se l'avviso fosse stato mostrato il 30 agosto (il loro tempo), ma con la differenza di fuso orario del server potevano arrivare il 29 agosto e l'avviso sarebbe stato mostrato.
Quindi volevo combatterlo. Quindi ora non sono sicuro di dover archiviare l'ora locale quindi utilizzare questo materiale offset? O semplicemente memorizzare l'ora UTC. Con la sola memorizzazione dell'ora UTC potrebbe ancora essere sbagliato, poiché l'utente probabilmente penserebbe ancora in ora locale e non sono sicuro di come l'UTC funzioni davvero potrebbe comunque finire una differenza di tempo.
Edit3
var info = TimeZoneInfo.FindSystemTimeZoneById(id)
DateTimeOffset usersTime = TimeZoneInfo.ConvertTime(DataBaseUTCDate,
TimeZoneInfo.Utc, info);
'DateTime.Now.Kind' è già' Locale'; non è necessario chiamare 'SpecifyKind' su di esso. – SLaks
@Edit 2: memorizza gli avvisi in UTC e li mostra nel fuso orario fornito dall'utente come mostrato nella mia risposta. – dtb
Quindi, come funzionerebbe? Ottengo DateTime.UtcNow quindi filtro gli avvisi dal db? quindi convertire i risultati trovati nel loro tempo locale? – chobo2