获取格式化字符串以表示UTC偏移量的最佳方法是什么?

时间:2011-02-02 19:21:32

标签: c# datetime formatting timezone

我需要格式化日期:20110202192008-0500。下面的代码可以解决问题,但我想知道在c#3.5中是否有更好/更清晰的方法来做到这一点。谢谢!

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

7 个答案:

答案 0 :(得分: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 :(得分:3)

如果您有DateTimeOffset,自定义说明符zzz将输出时区偏移量,但采用更标准的“+ HH:mm”格式。如果你不想要冒号,那么替换字符串就可以了。

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

答案 2 :(得分: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);

或您可以想到的任何其他方式。

答案 3 :(得分:2)

我们发现 DateTimeOffset.ToString(“o”)最适合。例如:

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

如果需要从DateTime转换,请使用helper方法,如:

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

答案 4 :(得分:0)

尝试使用 var date = DateTimeOffset.Now; var timestamp = $"{date:yyyy-MM-dd'T'HH:mm:ss.fff}{date.Offset.Ticks:+;-;}{date.Offset:hhmm}"; ......或类似的东西

答案 5 :(得分:0)

您可以使用其中一个DateTime Standard 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"

答案 6 :(得分:-1)

我认为有很多方法,例如:

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