当我使用下面的代码时,我在开发者电脑和远程服务器上获得了不同的结果。
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土耳其语,但它们的区域日期时间设置都相同。
为什么我会得到不同的结果?
答案 0 :(得分:1)
我不太熟悉Noda Time,但我有几点要说:
DateTimeZoneProviders.Tzdb
不的时区标识符为TUR
据我所知,您应该使用Europe/Istanbul
代替。LocalDateTimePattern
方法创建CreateWithCurrentCulture
时,它会使用当前区域性设置,这两种方式在您的服务器中都有所不同。小心一点。LocalDateTimePattern.Parse
方法使用当前模式的规则。您的字符串为12.11.2016 21:30
,但您的模式为yyyy-MM-dd HH:mm:ss
。你明白我的观点,不是吗? en-US
和tr-TR
种文化都使用GregorianCalendar
作为Calendar
属性,这不会影响结果。您可能想要检查LocalDateTimePattern.Parse
方法行。
例如;
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
。