使用正确的偏移

时间:2016-11-18 07:00:40

标签: c# datetime

我的应用以UTC格式获取DateTime对象,需要以EST格式输出为字符串。我已经尝试了以下代码,但是当我得到输出时,偏移仍显示为+00:00而不是-05:00

static void Main(string[] args)
    {
        var currentDate = DateTime.Now.ToUniversalTime();
        var convertedTime = ConvertUtcToEasternStandard(currentDate);

        Console.WriteLine(currentDate.ToString("yyyy-MM-ddTHH:mm:sszzz"));
        Console.WriteLine(convertedTime.ToString("yyyy-MM-ddTHH:mm:sszzz"));
    }

private static DateTime ConvertUtcToEasternStandard(DateTime dateTime)
    {
        var easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
        return TimeZoneInfo.ConvertTimeFromUtc(dateTime, easternZone);
    }

输出:

2016-11-18T06:56:14+00:00
2016-11-18T01:56:14+00:00

所以时间正确移动,但当我希望它为-05:00时,偏移量保持在+00:00。知道如何使用上面的格式字符串输出时,如何使用正确的偏移量获取DateTime对象?

1 个答案:

答案 0 :(得分:2)

我不久前在API中读过这篇文章,基本上,DateTime值,zzz格式偏移是非常不可能的。

  

使用DateTime值,“zzz”自定义格式说明符表示本地操作系统的时区与UTC的签名偏移量,以小时和分钟为单位。它不反映实例的DateTime.Kind属性的值。因此,建议不要将“zzz”格式说明符与DateTime值一起使用。

     

使用DateTimeOffset值时,此格式说明符表示DateTimeOffset值与UTC的偏移量,以小时和分钟为单位。

     

偏移量始终以前导符号显示。加号(+)表示UTC之前的小时数,减号( - )表示UTC之后的小时数。一位数的偏移量采用前导零格式化。

例如,我在东部标准时间 ,这是我的结果:

2016-11-18T07:9:38-05:00
2016-11-18T02:9:38-05:00

显然,UTC时间的偏移量不应为-05:00

稍微修改您的代码,我们有一个解决方案:

void Main()
{
    var currentDate = DateTimeOffset.Now.ToUniversalTime();
    var convertedTime = ConvertUtcToEasternStandard(currentDate);

    var format = "yyyy-MM-ddTHH:m:sszzz";
    Console.WriteLine(currentDate.ToString(format));
    Console.WriteLine(convertedTime.ToString(format));
}

// Define other methods and classes here
private static DateTimeOffset ConvertUtcToEasternStandard(DateTimeOffset dateTime)
{
    var easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
    return TimeZoneInfo.ConvertTime(dateTime, easternZone);
}

结果:

2016-11-18T07:17:46+00:00
2016-11-18T02:17:46-05:00

那更像是它。

注意:取代以前的代码,无知得到了我的最好,我没有意识到它不能正常工作。 TimeZoneInfo.ConvertTime需要DateTimeOffset来完成我们想要的工作。

如果我们为Pacific Standard Time添加另一个案例:

private static DateTimeOffset ConvertUtcToPacificStandard(DateTimeOffset dateTime)
{
    var pacificZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
    return TimeZoneInfo.ConvertTime(dateTime, pacificZone);
}

我们得到了正确的结果:

2016-11-17T23:21:21-08:00