如何将日期时间转换为基于 UTC 的计时值以比较计时 - C#
-
14-12-2019 - |
题
我有字符串(变量是 fileDate
),日期值采用以下格式:
2011/2/12 11:58 上午
现在我想将其转换为日期,然后转换为基于 UTC 时间,因为我在比较不同机器中的日期时遇到问题,所以*我总是想将所有字符串(正在比较)转换为 Utc_date 值。*
我尝试了下面的代码,但它不起作用,因为我无法将上面的字符串转换为基于日期时间的字符串(因为它没有秒)。
DateTime date = Convert.ToDateTime(fileDate);
date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
fileDate = date.ToString("MM/dd/yyyy hh:mm tt");
上面没有显示 FormatException。你能帮忙吗?
解决方案
首先,我建议使用 DateTime.ParseExact
或者 TryParseExact
- 我不清楚您的样本是 12 月 2 日还是 2 月 12 日。指定格式很可能会删除您的 FormatException
.
下一个问题是确定您想要将其转换为哪个时区 - 您是说 11:58 是一个 当地的 某个时区的时间,或者是 已经 UTC 时间?
- 如果它是运行此代码的时区的本地时间,您可以使用
DateTimeStyles.AssumeLocal | DateTimeStyles.AdjustToUniversal
将其作为解析的一部分来执行。 - 如果已经是通用时间,请使用
DateTimeStyles.AssumeUniversal
- 如果是不同时区的当地时间,您需要使用
TimeZoneInfo
来执行转换。
另外,如果是当地时间,您需要考虑两个极端情况(假设您使用的时区遵守夏令时):
- 当地时间可能是 跳过 由于 DST 转换,时钟向前推进。因此,如果时钟从凌晨 1 点跳到凌晨 2 点,那么凌晨 1:30 根本就不存在。
- 当地时间可能是 模糊的 由于 DST 转换,当时钟返回时。因此,如果时钟从凌晨 2 点拨回到凌晨 1 点,那么就会出现凌晨 1:30 两次 在不同的 UTC 时间 - 您对哪个事件感兴趣?
您应该决定如何处理这些情况,并确保它们包含在单元测试中。
另一种选择是使用我的日期和时间库, 野田时间, ,它更明确地区分了“本地日期/时间”和“特定时区的日期/时间”(以及其他)的概念。
其他提示
你应该使用 DateTime.ParseExact
将值获取到正确的 DateTime 实例中,然后您可以使用 .ToUniversalTime()
获取 UTC 时间(这与服务器计算机中的时间差有关)
可以使用:
DateTime.Now.ToUniversalTime();
我不是故意对你说的应该使用“datetime.now”,但是你得到了作为DateTime对象的一部分的指向,你有一个方法将其转换为通用时间
http://msdn.microsoft.com/zh-US / Library / System.datetime.tounivesaltime.aspx