我有一个运行在azure云上的服务。该服务每1分钟运行一次,并从ftp服务器上挑选一些文件。这些文件有Datetime字段,而没有datetimeoffset,当服务读取这些字段时,它们就变成了UTC日期。这些FTp服务器在不同的时区。
例如其中一个ftp位于GMT时区。假设文件日期为12/5/2015时间12:15。它被服务读取为UTC(因为没有接收到时区),并存储在数据库中为12/5/2015:12:15:00 +0:00,而它应该是2015年12月5日:11:15:00 +0:00
我仍然想在数据库中保存日期为UTC,需要一种方法来获得这些ftp时区,所以我可以正确解析日期。
问题是我们不能对文件做任何修改。云服务是否可以为这些FTP获取时区?
这里没有特定的Azure,但您可以推出自己的解决方案。
您必须做一些奇特的事情来猜测FTP服务器的时区,这将涉及对服务器进行DNS查找以找出它的IP地址,将该IP地址映射到城市,并查找该城市的时区。你可以这么做,但是这样很容易出错。
有一个更容易和更可靠的选择。听起来你的FTP服务器列表是静态的。您可以创建一个查找表,其中显示每个FTP服务器所在的时区,并使用该表确定应该使用哪个时区偏移量。
最佳实践:服务器端代码永远不应该依赖于托管代码的服务器的时区或区域性设置。相反,这些问题应该在代码本身中解决。
例如,假设你的服务是用c#/.NET编写的,你可能有这样的代码:string s = "12/5/2015 12:15 PM"; // from the file
DateTime dt = DateTime.Parse(s);
DateTime utc = dt.ToUniversalTime();
上述代码在ToUniversalTime
函数期间依赖于服务器的本地时区。在Parse
函数期间,它还依赖于服务器的区域性。
相反,您应该了解输入文件的时区和文化。例如:
string s = "12/5/2015 12:15 PM"; // from the file
DateTime dt = DateTime.ParseExact(s, "M/d/yyyy h:mm tt", CultureInfo.InvariantCulture);
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard Time");
DateTime utc = TimeZoneInfo.ConvertTimeToUtc(dt, tz);
此代码提供了CET/CEST时区,并且还使用不变区域性提供了精确的输入格式。
晚了,但我想我应该把我的解决方案贴出来帮助其他人:
TimeZone localZone = TimeZone.CurrentTimeZone;
var cetZone = TimeZoneInfo.FindSystemTimeZoneById(localZone.StandardName);
var cetTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, cetZone);
DateCreated = Convert.ToDateTime(cetTime.ToString());
在我的例子中,localZone。StandardName给出的是"南非标准时间",我想应该是GMT+2。
希望这能帮助到其他人!
欢呼