2011-02-02 12 views
9

日付をフォーマットする必要があります:20110202192008-0500。次のコードはこのトリックを行いますが、C#3.5でこれを行うためのより良い/よりクリーンな方法があるかどうか疑問に思っていました。ありがとう!!フォーマットされた文字列を取得して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

私はこの権利を持っていることを確認するだけです:あなたはUTCの日付と時刻を表示していますので、読者が数学を自分で行うことができるようにオフセットを提供していますか? (この例では、現地時間の14:20:08が表示されます。) –

+0

Excactly。文字列を取得するためのよりクリーンな方法があるかどうか疑問に思うだけです。 – Mike

答えて

10

これはどう:

.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); 

ゴー・スティーラーズ(ストリップ中の男から)

+1

TimeSpanのToStringに3.5のフォーマットオーバーロードがありません:( – Mike

+0

+1その!!!! – Mike

+0

@Mike - ああ、ええ、私はあなたが持っているものを使うか、おそらくサブストリングをutcOffset.ToString()バージョンで使用します。 – SwDevMan81

2

DateTimeOffsetがある場合、カスタム指定子zzzは、より標準的な "+ HH:mm"形式ではあるが、タイムゾーンオフセットを出力します。コロンを使用したくない場合は、文字列置換がそのトリックを行います。

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

それはUTC時間を生成しません。 – SwDevMan81

+2

時刻とUTCオフセットを指定する標準的な方法は、現地時間とUTCからのオフセットです。 UTC時刻とその時刻に適用されていないローカルオフセットを使用すると、標準的な方法で完了したとみなしたときにエラーが発生する可能性があります。 –

+0

私は彼が望むものをOPに与えてくれることに同意します:) – SwDevMan81

-1

私は多くの方法は、例えば、あると思います。ここでは

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

UTCオフセットが常に負になることを意味するので、そこに '-'を入れたいとは思わない。 – SwDevMan81

+0

確かに、私の間違い。 – EvgK

+0

-1:夏時間に関係なく、現在のタイムゾーンのオフセットです。現在、パリではUTC + 2ですが、このコードは1時間のオフセットを表示します – CharlesB

2

はあなたが正確に何をします.NET 3.5と.NET 4.0の両方で動作するいくつかの拡張メソッドです

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); 
} 

これは、任意のDateTimeまたはDateTimeOffsetで呼び出すことができるようになりました。たとえば、次のように

string s = DateTime.Now.ToStringWithOffset(); 

または

string s = DateTimeTimeOffset.Now.ToStringWithOffset(); 

または

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

またはあなたが考えることができる方法の他の番号。

2

我々は、DateTimeOffset.ToString( "o")がそのために最適であることを発見しました。例:あなたのような日時、使用ヘルパーメソッドから変換する必要がある場合

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

var date = DateTimeOffset.Now; var timestamp = $"{date:yyyy-MM-dd'T'HH:mm:ss.fff}{date.Offset.Ticks:+;-;}{date.Offset:hhmm}"; を使用してみてください

/// <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

...または、このような何か

0

あなたがいずれかを使用することができますDateTimeStandard Formatsのいずれか、または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" 
関連する問題