Каков наилучший способ получить отформатированную строку для представления смещения UTC?

Мне нужно отформатировать дату так: 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 ответов


Как насчет этого:

.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)",@"");
 Console.WriteLine(utcFormat);

Go Steelers (от парня в полосе)


Если у вас DateTimeOffset, настраиваемый описатель zzz выведет смещение часового пояса, хотя и в более стандартном формате "+HH:mm". Если вы не хотите двоеточие, замена строки сделает трюк.

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

вот некоторые методы расширения, которые будут работать как в .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);

или любое другое количество способов, которые вы можете придумать.


мы обнаружили, что DateTimeOffset.ToString ("o") лучше для этого. Пример:

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

Если вам нужно преобразовать из DateTime, используйте вспомогательный метод, например:

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

попробуйте использовать var date = DateTimeOffset.Now; var timestamp = $"{date:yyyy-MM-dd'T'HH:mm:ss.fff}{date.Offset.Ticks:+;-;}{date.Offset:hhmm}"; ... или что-то вроде этого!--2-->


можно использовать DateTime Стандартные Форматы или создать Пользовательский Формат.

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

Я думаю, что есть много способов, например:

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