解析/格式化Datetime时如何控制时区偏移中':'的外观

时间:2011-03-09 15:18:08

标签: .net datetime timezone

我正在使用一种协议,该协议在指定日期时间信息时可以选择包含时区偏移量。我的代码是用C#编写的,我们使用的是4.0 .NET运行时。我看到在解析和格式化时有一个formatting option "zzz"来包含时区信息,但是看起来冒号(:)是固定的。例如,使用自定义格式字符串(yyyyMMddHHmmsszzz)格式化的Datetime可能显示为:

20100309101530-05:00

我正在使用的协议不包括时区偏移量中的冒号。此协议将格式化日期时间,并期望它们格式化为:

20100309101530-0500

使用包含时区偏移量的自定义格式化程序解析或格式化日期时间时,有没有办法控制冒号的外观?

4 个答案:

答案 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仅在没有定界符或为:时才有效。