Каков наилучший способ получить отформатированную строку для представления смещения 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");