Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将当前本地时间转换为任何其他时区_C#_.net_Datetime - Fatal编程技术网

C# 将当前本地时间转换为任何其他时区

C# 将当前本地时间转换为任何其他时区,c#,.net,datetime,C#,.net,Datetime,我想通过比较本地时间和UTC来测试一些与时区相关的代码。然而,该测试依赖于当地时间与UTC不同,我在英国,因此一年中有6个月,根据日期时间比较测试(由于夏季时间),当地时间为UTC 我可以硬编码我的测试,将UTCNow转换为特定的时区,比如EST,但我的代码有可能被用于美国系统,现在我也遇到了同样的问题 那么,有没有一种方法可以轻松地将DateTime.UtcNow转换为与本地时区完全不同的时区,而无需对其进行硬编码或假设我所在的时区 public static class DateTimeE

我想通过比较本地时间和UTC来测试一些与时区相关的代码。然而,该测试依赖于当地时间与UTC不同,我在英国,因此一年中有6个月,根据日期时间比较测试(由于夏季时间),当地时间为UTC

我可以硬编码我的测试,将UTCNow转换为特定的时区,比如EST,但我的代码有可能被用于美国系统,现在我也遇到了同样的问题

那么,有没有一种方法可以轻松地将DateTime.UtcNow转换为与本地时区完全不同的时区,而无需对其进行硬编码或假设我所在的时区

 public static class DateTimeExtensions
    {
        public static DateTime As(this DateTime source, string timeZoneName)
        {
            DateTime utcTime = DateTime.SpecifyKind(source, DateTimeKind.Unspecified);
            TimeZoneInfo newTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName);
            return TimeZoneInfo.ConvertTimeFromUtc(utcTime, newTimeZone);
        }
    }
用法:

        DateTime date1 = DateTime.UtcNow;
        DateTime date2 = date1.As("Eastern Standard Time");

net中的时区是一个非常令人困惑的问题。DateTime仅支持本地时区和UTC时区实际上,它没有不同时区的概念,因为它只获取机器的当前偏移量,并将其应用于UTC中的刻度计数值

所以在一开始,没有办法改变到另一个时区,但是你可以模拟一些东西。如果要根据示例模拟时区GMT+2,必须首先检索当前区域偏移量,并将此偏移量与所需偏移量的差值添加到本地日期,如下所示:

TimeSpan targetOffset = new TimeSpan(2, 0, 0) - TimeZoneInfo.Local.BaseUtcOffset; //target to GMT+2
DateTime targetNow = DateTime.Now + targetOffset;
通过这种方式,日期将具有与该时区相同的值,但对于使用datetime对象而不仅仅是年/月/日/小时/分钟/秒的计算,所有这些值都将是错误的,因为该对象将被标记为本地,因此将具有错误的值

要解决这个问题,您有两个选择,颠倒您的逻辑(将非本地时间转换为本地时间),或者只使用UTC日期

第一种方法非常简单:

DateTime nonLocal = new DateTime(2016, 10, 21, 13, 33, 0); //We suppose we want 2016-10-21 13:33:00 at GMT+2
DateTime local = nonLocal + (TimeZoneInfo.Local.BaseUtcOffset - new TimeSpan(2, 0, 0));
这将产生正确的DateTime操作,但是,这里我们再次讨论问题,如果使用年/月/日/小时/分钟,它们将位于本地区域,而不是假定的区域,并且使用这些属性的代码将失败


最后,最好的方法是第二种方法,你只需忘记时区,只要你得到一个日期时间,你把它转换成UTC,所有的工作都会完美无瑕,当你需要表示数据时,只需将它转换成本地,一切都完成了,不必担心DateTime算术或属性仅仅因为在另一个时区而不同。

好的,正如我在评论中提到的,如果您想得到与您的时区不同的时区,您可以这样做:

var zone = TimeZoneInfo.GetSystemTimeZones()
           .Where(x=>x.BaseUtcOffset != TimeZoneInfo.Local.BaseUtcOffset)
           .First();
要将UTC日期时间转换为其他时区,必须使用,示例:


您可以检查我的宠物项目中的示例

不确定我是否正确理解您的意思,但是如果您还想将UTC转换为另一个区域,您可以获得与本地
var zone=TimeZoneInfo.GetSystemTimeZones()不同的区域。其中(x=>x.BaseUtcOffset!=TimeZoneInfo.local.BaseUtcOffset)。First()@tym32167是的,我想将UTC转换为一个时区,它与我的本地时区不同,并且本地时间与UTC完全不同。我认为你的评论是正确的,你能提供一个详细的答案吗?所以,我上面的评论应该对你有帮助是的,但它们会帮助我,以及其他人,更多的是作为一个答案:)这并没有回答这个问题。。。它迫使我指定时区,而不是自动选择时区。这包括“轻松地将DateTime.UtcNow转换为与我的本地时区完全不同的时区”。仅仅因为示例中的时区是硬编码的,并不意味着您必须这样做。你可以随便喂一只。在这一页上有3个例子说明了如何做到这一点。这是一个很好的小解决方案。问题是你丢失了日期上的区域信息,它变成了本地的,所以如果你存储它或使用日期时间算法,它会失败得很惨。这是.net和国际化的最大警告之一。
var datetime = // datetime in UTC, for example, DateTime.UtcNow
var zone = // target zone
return TimeZoneInfo.ConvertTimeFromUtc(datetime, zone);