2011-02-02 14 views
9

Ho bisogno di formattare una data in questo modo: 20110202192008-0500. Il seguente codice fa il trucco ma mi chiedevo se c'è un modo migliore/più pulito per farlo in C# 3.5. Grazie!!Qual è il modo migliore per ottenere una stringa formattata per rappresentare l'offset UTC?

var date = DateTime.Now; 
    var strDate = TimeZoneInfo.ConvertTimeToUtc(date).ToString("yyyyMMddHHmmss"); 
    var offsetHours = TimeZoneInfo.Local.GetUtcOffset(date).Hours.ToString("00"); 
    var offsetMinutes = TimeZoneInfo.Local.GetUtcOffset(date).Minutes.ToString("00"); 
    Console.Write(string.Concat(strDate, offsetHours, offsetMinutes)); 
+0

Giusto per essere sicuro di aver capito bene: stai visualizzando la data e l'ora dell'UTC, quindi offri l'offset in modo che il lettore possa fare i conti da solo? (Tale che l'esempio mostra 14:20:08 ora locale.) –

+0

Esattamente. Mi chiedo solo se c'è un modo più pulito per ottenere la stringa. – Mike

risposta

10

ne dite di questo:

.NET 4

var utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now); 
Console.WriteLine(DateTime.UtcNow.ToString("yyyyMMddHHmmss") + ((utcOffset < TimeSpan.Zero) ? "-" : "+") + utcOffset.ToString("hhmm")); 

NET 3,5

var utcAlmostFormat = DateTime.UtcNow.ToString("yyyyMMddHHmmss") + TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now); 
var utcFormat = System.Text.RegularExpressions.Regex.Replace(utcAlmostFormat, @"(\d\d):(\d\d):(\d\d)",@"$1$2"); 
Console.WriteLine(utcFormat); 

Go Steelers (da un ragazzo nella Striscia)

+1

ToString sul TimeSpan non ha un sovraccarico di formato in 3.5 :( – Mike

+0

+1 per quello !!!! – Mike

+0

@Mike - Ah dannazione, ok, sì, userei quello che hai o forse usare la sottostringa sulla versione utcOffset.ToString(). – SwDevMan81

2

Se si dispone di DateTimeOffset, lo specificatore personalizzato zzz emetterà l'offset del fuso orario, sebbene nel formato "+ HH: mm" più standard. Se non vuoi i due punti, una stringa sostituirà il trucco.

Debug.WriteLine(DateTimeOffset.Now.ToString("yyyyMMddHHmmsszzz").Replace(":", "")); 
// Result: "20110202153631-0500" 
+0

che non produrrà comunque l'ora UTC. – SwDevMan81

+2

Il modo standard per specificare l'ora e l'offset UTC è l'ora locale e lo scostamento da UTC. Se usi l'ora UTC e un offset locale che non è stato applicato all'ora, ti stai preparando per gli errori, quando qualcuno assume che sia fatto nel modo standard. –

+0

Sono d'accordo, solo dando all'OP quello che vuole :) – SwDevMan81

-1

Penso che ci siano un sacco di modi, ad esempio:

var offset = TimeZoneInfo.Local.BaseUtcOffset; 
    string result = DateTime.UtcNow.ToString("yyyyMMddHHmmss") + offset.Hours.ToString("00") + offset.Minutes.ToString("00"); 
+0

Non penso che tu voglia il '-' lì, poiché ciò implica che l'offset dell'UTC sarà sempre negativo. – SwDevMan81

+0

certo, mio ​​errore. – EvgK

+0

-1: è l'offset del fuso orario corrente, indipendentemente dall'ora legale. Attualmente a Parigi siamo a UTC + 2, ma questo codice mostra un offset di 1 ora – CharlesB

2

Ecco alcuni metodi di estensione che funzionano sia in Net 3.5 e .Net 4.0, che farà esattamente ciò che sei chiedendo in un modo molto diretto:

public static string ToStringWithOffset(this DateTime dt) 
{ 
    return new DateTimeOffset(dt).ToStringWithOffset(); 
} 

public static string ToStringWithOffset(this DateTime dt, TimeSpan offset) 
{ 
    return new DateTimeOffset(dt, offset).ToStringWithOffset(); 
} 

public static string ToStringWithOffset(this DateTimeOffset dt) 
{ 
    string sign = dt.Offset < TimeSpan.Zero ? "-" : "+"; 
    int hours = Math.Abs(dt.Offset.Hours); 
    int minutes = Math.Abs(dt.Offset.Minutes); 

    return string.Format("{0:yyyyMMddHHmmss}{1}{2:00}{3:00}", dt, sign, hours, minutes); 
} 

È ora possibile chiamare questi su qualsiasi DateTime o DateTimeOffset si desidera. Per esempio:

string s = DateTime.Now.ToStringWithOffset(); 

o

string s = DateTimeTimeOffset.Now.ToStringWithOffset(); 

o

TimeSpan offset = TimeZoneInfo.Local.GetUtcOffset(someDate); 
string s = someArbitraryTime.ToStringWithOffset(offset); 

o qualsiasi altro numero di modi che si può pensare.

2

Abbiamo trovato che DateTimeOffset.ToString ("o") è la cosa migliore. Esempio:

DateTime.UtcNow.UtcToDateTimeOffset(User.GetTimeZone()).ToString("o"); 

Se avete bisogno di convertire da DateTime, metodo di supporto uso come:

/// <summary>Converts from a UTC DateTime to the user's local DateTime</summary> 
    /// <param name="utcDateTime">UTC DateTime</param> 
    /// <param name="timeZoneInfo">The time zone info.</param> 
    /// <returns>The DateTime in the user's time zone</returns> 
    public static DateTimeOffset UtcToDateTimeOffset(this DateTime utcDateTime, TimeZoneInfo timeZoneInfo = null) 
    { 
     if (utcDateTime.Kind != DateTimeKind.Utc) 
     { 
      throw new InvalidTimeZoneException("Converting UTC to Local TimeZone, but was not UTC."); 
     } 

     DateTimeOffset dto = new DateTimeOffset(utcDateTime, TimeSpan.Zero); 

     return timeZoneInfo.IsNotNull() ? dto.ToOffset(timeZoneInfo.GetUtcOffset(dto)) : dto; 
    } 
0

Provare a usare var date = DateTimeOffset.Now; var timestamp = $"{date:yyyy-MM-dd'T'HH:mm:ss.fff}{date.Offset.Ticks:+;-;}{date.Offset:hhmm}"; ... o qualcosa di simile

0

È possibile utilizzare uno di DateTimeStandard Formats o creare uno Custom Format.

// Round-trip date/time pattern: "O", "o" 
DateTime.Now.ToString("o") // "2018-01-15T11:00:50.5604578-05:00" 
DateTime.UtcNow.ToString("o") // "2018-01-15T16:00:50.5604578Z" 

// Universal sortable date/time pattern: "u" 
DateTime.Now.ToString("u") // "2018-01-15 16:00:50.5604578Z" 
DateTime.UtcNow.ToString("u") // "2018-01-15 16:00:50.5604578Z" 

// Custom format 
DateTime.Now.ToString("yyyyMMddHHmmssK") // "20180115160050-05:00" 
DateTime.UtcNow.ToString("yyyyMMddHHmmssK") // "20180115160050Z" 
Problemi correlati