相同的代码但得到不同的结果

时间:2016-11-13 06:57:52

标签: c# datetime nodatime

当我使用下面的代码时,我在开发者电脑和远程服务器上获得了不同的结果。

string _QsDateTime = "12.11.2016 21:30";
var _CountryZone = DateTimeZoneProviders.Tzdb["TUR"];
var _DatePattern = LocalDateTimePattern.CreateWithCurrentCulture("yyyy-MM-dd HH:mm:ss");
var _LocalTime = _DatePattern.Parse(_QsDateTime).Value;
var _LocalTime2TargetZoneTime = _LocalTime.InZoneStrictly(_CountryZone);
var _TargetZone2Utc = _LocalTime2TargetZoneTime.WithZone(DateTimeZone.Utc).ToDateTimeUtc();
_QsDateTime = _TargetZone2Utc.ToString("yyyy-MM-dd HH:mm:ss");

开发者PC结果为:“ 2016-11-12 19:30:00” 远程服务器结果为:“ 2016-12-11 19:30:00”

远程服务器规格是Windows 2012服务器英文开发者PC规格是Windows 7土耳其语,但它们的区域日期时间设置都相同。

为什么我会得到不同的结果?

1 个答案:

答案 0 :(得分:1)

我不太熟悉Noda Time,但我有几点要说:

  1. DateTimeZoneProviders.Tzdb 的时区标识符为TUR据我所知,您应该使用Europe/Istanbul代替。
  2. 当您使用LocalDateTimePattern方法创建CreateWithCurrentCulture时,它会使用当前区域性设置,这两种方式在您的服务器中都有所不同。小心一点。
  3. LocalDateTimePattern.Parse方法使用当前模式的规则。您的字符串为12.11.2016 21:30,但您的模式为yyyy-MM-dd HH:mm:ss。你明白我的观点,不是吗?
  4. 如果您的服务器确实得到了不同的结果,那么您不应该归咎于您的最后一行,因为en-UStr-TR种文化都使用GregorianCalendar作为Calendar属性,这不会影响结果。您可能想要检查LocalDateTimePattern.Parse方法行。
  5. 例如;

    using System;
    using NodaTime;
    using NodaTime.Text;
    
    public class Program
    {
        public static void Main()
        {
            string _QsDateTime = "12.11.2016 21:30";
            var _CountryZone = DateTimeZoneProviders.Tzdb["Europe/Istanbul"];
            var _DatePattern = LocalDateTimePattern.CreateWithCurrentCulture("dd.MM.yyyy HH:mm");
            var _LocalTime = _DatePattern.Parse(_QsDateTime).Value;
            var _LocalTime2TargetZoneTime = _LocalTime.InZoneStrictly(_CountryZone);
            var _TargetZone2Utc = _LocalTime2TargetZoneTime.WithZone(DateTimeZone.Utc).ToDateTimeUtc();
            _QsDateTime = _TargetZone2Utc.ToString("yyyy-MM-dd HH:mm:ss");
            Console.WriteLine(_QsDateTime);
        }
    }
    

    产生

    2016-11-12 19:30:00
    

    这里有 demonstration