我正在使用一种协议,该协议在指定日期时间信息时可以选择包含时区偏移量。我的代码是用C#编写的,我们使用的是4.0 .NET运行时。我看到在解析和格式化时有一个formatting option "zzz"来包含时区信息,但是看起来冒号(:)是固定的。例如,使用自定义格式字符串(yyyyMMddHHmmsszzz)格式化的Datetime可能显示为:
20100309101530-05:00
我正在使用的协议不包括时区偏移量中的冒号。此协议将格式化日期时间,并期望它们格式化为:
20100309101530-0500
使用包含时区偏移量的自定义格式化程序解析或格式化日期时间时,有没有办法控制冒号的外观?
答案 0 :(得分:9)
看起来没有任何内置内容(您可以使用zz
,但这会遗漏分钟数。)
您可以通过实例化DateTimeFormatInfo
来自行推广,将TimeSeparator
设置为string.Empty
,并在调用IFormatProvider
时将其用作DateTime.ToString
(并制作如果不是,则调用显式。)
但坦率地说,使用Replace
从默认返回值中删除不需要的:
非常容易。
答案 1 :(得分:5)
我遇到了同样的问题,最后使用了扩展程序
public static class DateTimeExtensions
{
public static String ToSomeFormat(this DateTimeOffset dateTime)
{
return dateTime.ToString("yyyyMMddHHmmsszzz").Replace(":", "");
}
}
答案 2 :(得分:2)
如果您在不适合使用替换或扩展的地方使用它(例如,当以-05:00
传递时,可能希望使用冒号将其输出为zzz
)和分钟数无关紧要,您可以使用zz00
进行伪造。
var date = new DateTimeOffset(2008, 8, 1, 0, 0, 0, new TimeSpan(-5, 0, 0));
Console.WriteLine(date.ToString("yyyy-MM-dd-HH:mm:ss(zz00)"));
// outputs 2008-08-01-00:00:00(-0500)
答案 3 :(得分:0)
我有完全相同的issue,试图以+0730
这样的格式格式化/解析时区。
zzz
格式化 DateTime将始终以hh:mm
格式输出时间偏移。
最初,我虽然可以通过覆盖DateTimeFormatInfo.TimeSeparator
(默认情况下为:
)来获得自定义格式,但是在时区的情况下,它会硬编码在System.DateTimeFormat.FormatCustomizedTimeZone
中:
// 'zzz*' or longer format e.g "-07:30"
result.AppendFormat(CultureInfo.InvariantCulture, ":{0:00}", offset.Minutes);
这里有response的工程师在.NET上工作:
zzz的格式设置为时间跨度,而不是常规的DateTime。从第一天开始就决定使用标准格式来格式化日期/时间对象中的时区部分。因此,有意总是使用:作为分隔时间跨度部分的分隔符。我知道您可以说这不是正确的决定,但是我们现在不能更改此决定,因为中断的范围非常大,因为许多人都依赖于采用这种格式解析日期。您仍然可以通过将:替换为所需的分隔符来解决此问题。
这是我的自定义时区格式的版本:
var utcOffset = dateTime.Kind == DateTimeKind.Utc? TimeSpan.Zero : TimeZoneInfo.Local.GetUtcOffset(dateTime);
var utcOffsetSrt = (utcOffset < TimeSpan.Zero ? "-" : "+") + utcOffset.ToString("hhmm", CultureInfo.InvariantCulture);
var dateTimeStr = dateTime.ToString("yyyyMMddHHmmss", CultureInfo.InvariantCulture);
var result = dateTimeStr + utcOffsetSrt;
解析不过可以与zzz
一起使用,用于空白分隔符:
var result = DateTime.ParseExact("+0000", "zzz", customInvariantCulture);
var resultOffset = TimeZoneInfo.Utc.GetUtcOffset(result.ToUniversalTime());
Assert.AreEqual(offset, resultOffset);
查看System.DateTimeParse.ParseTimeZoneOffset
:
if (str.Match(":"))
{
// Found ':'
if (!ParseDigits(ref str, 2, out minuteOffset))
{
return false;
}
}
因此,zzz
仅在没有定界符或为:
时才有效。