2015-11-11 5 views
8

Ho bisogno di aggiornare qualche parte di codice da chiamare staticamente DateTime.UtcNow per chiamare un servizio di provider di orari che restituisce, in pratica, DateTimeOffset.UtcNow. Per convertire ulteriormente questa istanza DateTimeOffset in DateTime, c'è la proprietà DateTime. In alternativa, sembra che ci sia una conversione implicita da DateTimeOffset a DateTime.DateTimeOffset.UtcNow.DateTime è equivalente a DateTime.UtcNow?

Sono un po 'preoccupato che potrebbero esserci alcuni casi limite che non riesco a vedere adesso dove questi due non sarebbero equivalenti. Ci sono?

+1

"Per convertire ulteriormente questa istanza DateTimeOffset in DateTime, c'è la proprietà DateTime" - c'è anche la proprietà 'UtcDateTime', che sembra più appropriata per lo scenario – Joe

risposta

4

Internamente si presenta in questo modo:

public static DateTimeOffset UtcNow { 
     get { 
      return new DateTimeOffset(DateTime.UtcNow); 
     } 
    } 

    public DateTime DateTime { 
     get { 
      return ClockDateTime; 
     } 
    } 
    private DateTime ClockDateTime { 
     get { 
      return new DateTime((m_dateTime + Offset).Ticks, DateTimeKind.Unspecified); 
     } 
    } 

    public DateTime UtcDateTime { 
     [Pure] 
     get { 
      Contract.Ensures(Contract.Result<DateTime>().Kind == DateTimeKind.Utc); 
      return DateTime.SpecifyKind(m_dateTime, DateTimeKind.Utc); 
     } 
    } 

così sembra che si potrebbe finire per ottenere un DateTime che si basa su UTC, ma poi viene convertito in Unspecified.

+0

In tal caso, se si chiama' DateTime.SpecifyKind' sul risultato essere abbastanza per renderlo del tutto identico a 'DateTime.UtcNow', giusto? – hvd

+0

Sembra corretto, tuttavia non lo renderebbe il terzo oggetto DateTime da creare? UTCNow, ClockDateTime e infine il tipo corretto. Se l'OP è felice di convertire allora sì, potrebbe essere ok. Se si tratta di un codice esistente che si basa su di essi che sono equivalenti al 100%, potrebbero esserci dei problemi. – MattC

+0

Posso usare '.UtcDateTime' invece della proprietà' .DateTime' nell'istanza 'DateTimeOffset'? Ad esempio: 'DateTimeOffset.UtcNow.UtcDateTime' –

2

Da the .NET reference source:

public static DateTimeOffset UtcNow { 
    get { 
     return new DateTimeOffset(DateTime.UtcNow); 
    } 
} 

Quindi, sì, sembra che sia equivalente a DateTime.UtcNow.

+0

Sembra essersi ulteriormente dilaniato un po 'più tardi, quindi penso che tu abbia ragione potrebbero avere lo stesso valore ma non sono sicuro riguardo l'impostazione di "DateTimeKind'. – MattC

3

Se si guarda il valore di DateTimeOffset.UtcNow.DateTime.Kind, verrà visualizzato Non specificato. I tipi non specificati vengono trattati come orari locali dal framework. Il tipo di DateTime.UtcNow è Utc, quindi ci saranno delle differenze quando le conversioni del fuso orario sono applicate al fuso orario locale.

Il lavoro è di utilizzare il DateTimeOffset.UtcNow.UtcDateTime che ha il tipo Utc specificato.