2012-12-18 25 views
13

Devo convertire le stringhe di data UTC a DateTimeOffsets.Convertire UTC DateTime a DateTimeOffset

Questo deve funzionare con un fuso orario diverso dal fuso orario del computer. E.g. il fuso orario attuale del computer è +02: 00, ma voglio creare un DateTimeOffset con offset -4: 00.

Ho già letto molte domande qui su StackOverflow, ma nessuno di loro ha risolto il mio problema.

Questo è ciò che ho bisogno di fare:

ingresso: "2012-11-20T00: 00: 00Z"

uscita: DateTimeOffset con:

  • UtcDateTime di 2012-11-20 00:00
  • l'offset Utc corretto per il fuso orario definito (01:00 in questo ex ampio)
  • LocalDateTime: 2012/11/20 01:00 (= UtcDateTime + Offset)

dell'ora legale Naturalmente si deve tener conto.

modificare: Per rendere le cose ancora più chiare, si prega di cercare di completare il seguente frammento di codice:

DateTimeOffset result; 
const string dateString = "2012-11-20T00:00:00Z"; 
var timezone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"); //this timezone has an offset of +01:00:00 on this date 

//do conversion here 

Assert.AreEqual(result.Offset, new TimeSpan(1, 0, 0)); //the correct utc offset, in this case +01:00:00 
Assert.AreEqual(result.UtcDateTime, new DateTime(2012, 11, 20, 0, 0, 0)); //equals the original date 
Assert.AreEqual(result.LocalDateTime, new DateTime(2012, 11, 20, 1, 0, 0)); 

risposta

9

Ecco la soluzione che state cercando:

const string dateString = "2012-11-20T00:00:00Z"; 
var timezone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"); //this timezone has an offset of +01:00:00 on this date 

var utc = DateTimeOffset.Parse(dateString); 
var result = TimeZoneInfo.ConvertTime(utc, timezone); 

Assert.AreEqual(result.Offset, new TimeSpan(1, 0, 0)); //the correct utc offset, in this case +01:00:00 
Assert.AreEqual(result.UtcDateTime, new DateTime(2012, 11, 20, 0, 0, 0)); //equals the original date 
Assert.AreEqual(result.DateTime, new DateTime(2012, 11, 20, 1, 0, 0)); 

Nota che stavi testando erroneamente la proprietà .LocalDateTime - che è sempre andando a convertire il risultato nel fuso orario locale del computer. Hai semplicemente bisogno della proprietà .DateTime.

+0

Grazie, sembra funzionare bene! – Fabian

3

E 'questo ciò che si vuole:

[Test] 
public void ParseUtcDateTimeTest() 
{ 
    DateTime dateTime = DateTime.Parse("2012-11-20T00:00:00Z"); 
    Assert.AreEqual(new DateTime(2012, 11, 20, 01, 00, 00), dateTime); 
    DateTimeOffset dateTimeOffset = new DateTimeOffset(dateTime); 
    Assert.AreEqual(new TimeSpan(0, 1, 0, 0), dateTimeOffset.Offset); 
} 
  • Nota che il mio asserisce sono validi in Svezia (CET)
  • Ci sono un paio di sovraccarichi su DateTime.Parse()

È questo utile per la vostra conversione:

[Test] 
public void ConvertTimeTest() 
{ 
    DateTime dateTime = DateTime.Parse("2012-11-20T00:00:00Z"); 
    TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard  Time"); 
    DateTime convertedTime = TimeZoneInfo.ConvertTime(dateTime, cstZone); 
    Assert.AreEqual(new DateTime(2012, 11, 19, 18, 00, 00), convertedTime); 
    TimeSpan baseUtcOffset = cstZone.BaseUtcOffset; 
    Assert.AreEqual(new TimeSpan(0, -6, 0, 0), baseUtcOffset); 
} 
+0

Questo non funzionerà se voglio utilizzare un altro fuso orario rispetto al fuso orario corrente. – Fabian

+0

@Fabian Aggiornato la mia risposta, spero che aiuti –

+0

Non sono sicuro di come questo possa aiutarmi.Convertire il DateTime è bello e tutto, ma come faccio a ottenere un DateTimeOffset? – Fabian

-1
const String dateString = "2012-11-20T00:00:00Z"; 
var offsetDate = DateTimeOffset.Parse(dateString); 
var offsetDate2 = DateTime.Parse(dateString); 

uscita è

offsetDate {20-11-2012 0:00:00 +00:00} System.DateTimeOffset 
offsetDate2 {20-11-2012 1:00:00}   System.DateTime 
+0

Questo non funzionerà se voglio usare un altro fuso orario rispetto al fuso orario corrente. – Fabian

+0

Aggiungi il secondo parametro, the cultureinfo. ecco una lista http://sharpertutorials.com/list-of-culture-codes/. esempio: var fmt = new CultureInfo ("en-AU"). DateTimeFormat; – VRC

+0

Ho provato questo, ma non importa quale CultureInfo io uso il DateTimeOffset ha sempre un offset di 00:00:00, che non è quello che voglio! – Fabian

Problemi correlati