Domanda

Ho un servizio web (in realtà un servizio wcf di abilitazione silverlight, ma a tutti gli effetti è un servizio web) con un metodo che accetta un parametro datetime. Il metodo viene chiamato da un client, che potrebbe trovarsi in un fuso orario diverso. Il servizio che ospita il servizio Web è in ora solare Pacifico e sembra che il servizio Web stia convertendo il valore dell'ora della data nel fuso orario del server. L'intento del servizio Web è di confrontare il valore datetime con un valore nel database, ma il valore nel database si basa sul fuso orario dei client, quindi a causa della conversione, il confronto non funziona.

Esiste un modo per disattivare la conversione?

È stato utile?

Soluzione

  

e sembra che il servizio Web stia convertendo il valore della data e ora nel fuso orario dei server.

Sto cercando di assicurarmi di avere questo corretto: il tuo metodo di servizio web accetta un parametro di tipo DateTime (come in, System.DateTime) e sta convertendo il parametro passato?

Gli oggetti DateTime non portano un fuso orario implicito, quindi qualsiasi determinazione da parte del servizio web di inferire l'ora locale sarebbe un difetto logico (almeno senza supportare i criteri del fuso orario.)

Se è possibile fornire i frammenti di codice del server e del client, ciò semplificherebbe la diagnosi dello scenario.

AGGIORNAMENTO: non sono sicuro che questo scenario sia accurato, quindi chiarisci:

  • Il client invia una richiesta con un valore DateTime di '12: 00: 00 00:00:00 PM CST '
  • Il server in PST riceve / interpreta la richiesta a '10: 00: 00 00:00:00 PM PST '

In questo caso, puoi convertire tutti i dati in ora UTC? Se stai eseguendo una ricerca di query, ciò implica anche la conversione dei dati memorizzati in UTC.

Altri suggerimenti

Non è del tutto vero che le istanze (strutture) di DateTime non riportano le informazioni su TimeZone. Esiste una proprietà DateTimeKind su ogni struttura DateTime, a partire da .NET ... 3.0? Non conosco la versione. & Quot; Tipo " è UTC, locale o non specificato. quindi, sebbene non sia un fuso orario di per sé, è un inidicazione che l'ora sia espressa nella zona locale o nel fuso orario universale. Controlla il documento per maggiori informazioni.

Per rispondere alla domanda originale: converti tutti in un unico fuso orario standard. UTC funziona bene ed è facile perché ci sono metodi integrati nel BCL, ma non importa quale fuso orario scegli. Basta convincere tutti a concordare uno standard.

Un'altra cosa che puoi fare è trasmettere i valori del tempo come " TotalSeconds " valori da ... qualche tempo specifico nel passato. Come il 1 gennaio 1970 (unix time_t) o il 1 gennaio 1601 (windows FILETIME). Ma implicito in questo approccio è che tutte le parti che hanno collaborato concordano sul fatto che questo punto di inizio nel tempo è UTC. Quindi un milione di secondi dall'inizio (l '"epoca") si riferisce allo stesso momento, sia che io sia a El Paso o Nashua, Tokyo o Londra.

Dai un'occhiata a questa domanda, ha qualche discussione su ciò che vuoi.

Sembra che il modo più semplice sia passare il fuso orario del client anche nel metodo web, o semplicemente passare tutto il tempo come stringa anziché come DateTime

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top