0

我的字符串(变量 is 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。你能帮忙吗?

4

3 回答 3

2

首先,我建议使用DateTime.ParseExactor 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 时间出现两次- 您对哪个出现感兴趣?

您应该决定如何处理这些情况,并确保它们包含在您的单元测试中。

另一种选择是使用我的日期和时间库Noda Time,它更明确地将“本地日期/时间”和“特定时区中的日期/时间”(以及其他)的概念分开。

于 2012-03-15T06:47:07.540 回答
0

您应该使用DateTime.ParseExact将值获取到适当的 DateTime 实例中,然后您可以使用.ToUniversalTime()来获取 UTC 时间(这与您的服务器机器中的时间差有关)

于 2012-03-15T06:46:44.170 回答
0

您可以使用 : DateTime.Now.ToUniversalTime();

我并不是要对您说应该使用“DateTime.Now”,但您会明白,作为 DateTime 对象的一部分,您有一种方法可以将其转换为通用时间

http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx

于 2012-03-15T06:47:07.913 回答