我需要格式化日期: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));
答案 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");