2011-02-02 33 views
9

Tôi cần định dạng ngày như sau: 20110202192008-0500. Đoạn mã sau thực hiện thủ thuật nhưng tôi đã tự hỏi liệu có cách nào tốt hơn/sạch hơn để làm điều này trong C# 3.5. Cảm ơn!!Cách tốt nhất để lấy chuỗi được định dạng để biểu diễn bù trừ UTC là gì?

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

Chỉ cần đảm bảo rằng tôi có quyền này: bạn đang hiển thị ngày giờ UTC, sau đó cung cấp bù đắp để người đọc có thể tự làm toán? (Chẳng hạn như ví dụ cho thấy 14:20:08 giờ địa phương.) –

+0

Excactly. Chỉ cần tự hỏi nếu có một cách sạch hơn để có được chuỗi. – Mike

Trả lời

10

Làm thế nào về điều này:

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 (từ một chàng trai trong Strip)

+1

ToString trên TimeSpan không có quá tải định dạng trong 3.5 :( – Mike

+0

+1 cho điều đó !!!! – Mike

+0

@Mike - Ah damn, ok, yeah Tôi sẽ sử dụng những gì bạn có hoặc có thể sử dụng chuỗi con trên phiên bản utcOffset.ToString(). – SwDevMan81

2

Nếu bạn có DateTimeOffset, thông số tùy chỉnh zzz sẽ xuất ra bù trừ múi giờ, mặc dù ở định dạng "+ HH: mm" chuẩn hơn. Nếu bạn không muốn đại tràng, một chuỗi thay thế sẽ làm các trick.

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

Điều đó sẽ không tạo ra thời gian UTC mặc dù. – SwDevMan81

+2

Cách tiêu chuẩn để xác định thời gian và chênh lệch UTC là giờ địa phương và chênh lệch từ UTC. Nếu bạn sử dụng thời gian UTC và chênh lệch cục bộ chưa được áp dụng cho thời gian, thì bạn sẽ tự thiết lập lỗi, khi ai đó giả định rằng nó được thực hiện theo cách tiêu chuẩn. –

+0

Tôi đồng ý, chỉ cần cung cấp cho OP những gì anh ấy muốn :) – SwDevMan81

-1

Tôi nghĩ rằng có rất nhiều cách khác nhau, ví dụ:

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

Tôi không nghĩ rằng bạn muốn '-' trong đó, vì điều này ngụ ý Bù trừ UTC sẽ luôn âm. – SwDevMan81

+0

chắc chắn, sai lầm của tôi. – EvgK

+0

-1: Đó là độ lệch của múi giờ hiện tại, bất kể tiết kiệm ban ngày. Hiện tại ở Paris chúng tôi đang ở UTC + 2, nhưng mã này hiển thị một khoảng thời gian là 1 giờ – CharlesB

2

Dưới đây là một số phương pháp mở rộng sẽ làm việc trong cả hai Net 3.5 và Net 4.0 mà sẽ thực hiện chính xác những gì bạn đang hỏi một cách rất thẳng về phía trước:

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

Bây giờ bạn có thể gọi chúng trên bất kỳ DateTime hoặc DateTimeOffset nào bạn muốn. Ví dụ:

string s = DateTime.Now.ToStringWithOffset(); 

hoặc

string s = DateTimeTimeOffset.Now.ToStringWithOffset(); 

hoặc

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

hoặc bất kỳ số khác cách bạn có thể nghĩ đến.

2

Chúng tôi thấy rằng DateTimeOffset.ToString ("o") là tốt nhất cho điều đó. Ví dụ:

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

Nếu bạn cần chuyển đổi từ DateTime, sử dụng phương pháp helper như:

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

Cố gắng sử dụng var date = DateTimeOffset.Now; var timestamp = $"{date:yyyy-MM-dd'T'HH:mm:ss.fff}{date.Offset.Ticks:+;-;}{date.Offset:hhmm}"; ... hoặc một cái gì đó như thế này

0

Bạn có thể sử dụng một trong của số DateTimeStandard Formats hoặc tạo 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" 
Các vấn đề liên quan