Cai*_*ard 3 c# timezone datetime parsing dst
我读过很多SO文章,但我似乎无法找到问题的好答案.发布的建议包括将日期转换为字符串多次以及从字符串转换为一次的函数,在结尾处连接位并且它们似乎只是......凌乱
所以问题:
我们在世界各地都有服务器.所有服务器都在其自己的本地时间运行,并使用服务器本地的时间条目保留日志.有些服务器在DST观察区域,有些则不是
假设我从日志中得到这些字符串:2013-01-01 12:34:56,2013-07-01 12:34:56 而且我知道这台服务器在纽约,所以它是UTC-5或UTC-4 DST正在运行中
我在香港的服务器上有相同的字符串,其中DST不适用,时区为+8
我所追求的是一段代码,我可以告诉它:
并且代码将字符串解析为DateTimeOffset,如果解析的时间与DST相关,则根据DST调整偏移量
例如:NY服务器日志显示" 2013-01-01 ..." DST 并不适用于这个日期在一月如此解析的日期应该是:在纽约时间12:34:56,又名17点34分56秒在UTC(因为它是-5,没有DST)
NY服务器日志显示" 2013-07-01 ..." DST DOES适用于这个日期六月如此解析的日期应该是:12:34:56纽约时段,又名16时34分56秒在UTC(因为它是-4,与DST)
HK服务器,两个日期时间解析为UTC时间04:34:56
多谢你们
首先,我强烈建议您将系统更改为在任何地方登录UTC.它会让你的生活变得更加简单.
如果你真的坚持与你有什么,你应该使用DateTime.TryParseExact一个DateTimeStyles刚刚0(默认值).这会给你一个价值DateTimeKind的Unspecified,这是你想要的.(它不是UTC,它不是机器进行解析的本地.)
然后,您可以使用TimeZoneInfo.GetUtcOffset(使用该日志的正确时区)计算偏移量,并DateTimeOffset从两者中创建一个.
作为一个完全偏向的,你也可以改为使用我维护的Noda Time项目,这将使你的代码更容易理解:)
要获取记录在不同日志文件中的UTC时间,您需要知道本地时区的名称.然后,您可以使用DateTimeOffset-struct TimeZoneInfo-class来计算UTC时间:
public DateTime ParseAsUtc(string logDate, string timezoneName)
{
var timeZone = TimeZoneInfo.FindSystemTimeZoneById(timezoneName);
var localDate = DateTime.Parse(logDate);
var offset = new DateTimeOffset(localDate, timeZone.GetUtcOffset(localDate));
return offset.ToUniversalTime().DateTime;
}
ParseAsUtc("2013-01-01 12:34:56", "Eastern Standard Time"); //01.01.2013 17:34:56
ParseAsUtc("2013-07-01 12:34:56", "Eastern Standard Time"); //01.07.2013 16:34:56
ParseAsUtc("2013-01-01 12:34:56", "China Standard Time"); //01.01.2013 04:34:56
ParseAsUtc("2013-01-01 12:34:56", "China Standard Time"); //01.07.2013 04:34:56
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2295 次 |
| 最近记录: |