0

说我有字符串"1 December 2012, 8:00:00"

我知道它是 AEST 时间(无论服务器在哪里),当时(12 月 1 日)处于任何夏令时状态,但我想将它作为 UTC 存储在数据库中。

如何将其转换为 UTC,无论服务器在哪里,都将字符串视为 AEST?

4

3 回答 3

3

假设您可以解析日期DateTime.TryParse并将其转换为DateTime结构,然后您可以调用ToUniversalTime以转换为 UTC。

例如:

DateTime dt;
DateTime utcDate;
if (DateTime.TryParse(dateTimeString, out dt))
{
    utcDate = dt.ToUniversalTime();
    // store utcDate in database
}
else
{
    // error, unable to parse the date
}

当然,假设您的本地时间是 AEST,或者您正在解析的日期/时间字符串具有时区说明符。

如果您的本地时间是其他时间并且没有时区说明符,那么您需要解析日期,添加或减去您的时区的偏移量以匹配 AEST,然后调用ToUniversalTime.

于 2012-12-07T00:40:29.640 回答
2

您可以首先初始化从您上面指定的字符串System.DateTime中获取的a 。DateTime然后,您可以使用System.DateTime.ToUniversalTime()which 将当前System.DateTime对象的值转换为协调世界时并将其存储在数据库中。

例子

DateTime AEST = DateTime.Parse("1 December 2012, 8:00:00"); //Initialize a new DateTime of name AEST which gets a System.DateTime from 1 December 2012, 8:00:00
DateTime UTC = AEST.ToUniversalTime(); //Initialize a new DateTime of name UTC which converts the value from AEST to Coordinated Universal Time
System.Diagnostics.Debug.WriteLine(UTC.ToString()); //Writes 12/1/2012 6:00:00 AM

注意:如果您愿意将时间从一个时区转换到另一个时区,您可以使用您要转换的TimeZoneInfo.ConvertTime(DateTime dateTime, TimeZoneInfo sourceTimeZone, TimeZoneInfo, destinationTimeZone)地方dateTime、您要转换的时区以及您要从中获取的时区DateTimesourceTimeZoneDateTimedestinationTimeZonedateTime

例子

string _date = "1 December 2012, 8:00:00"; //Initializes a new string of name _date as "1 December 2012, 8:00:00"
string targetTimeZone = "W. Australia Standard Time"; //Initializes a new string of name targetTimeZone as "W. Australia Standard Time"
DateTime sourceDateTime = DateTime.Parse(_date); //Initializes a new DateTime of name sourceDateTime which gets a valid DateTIme object from 1 December 2012, 8:00:00
DateTime AEST = TimeZoneInfo.ConvertTime(sourceDateTime, TimeZoneInfo.Local, TimeZoneInfo.FindSystemTimeZoneById(targetTimeZone)); //Initializes a new DateTime which converts the time zone from sourceDateTime assuming that sourceDateTime's TimeZone is the local time zone of the machine to an W. Australia Standard Time time zone of name AEST  

1 December 2012, 8:00:00假设它的时区是机器的本地时区(例如Egypt Standard Time: (GMT+02:00) Cairo),W. Australia Standard Time: (GMT+08:00) Perth这将转换12/1/2012 2:00:00 PM

有关时区列表,请参阅Microsoft 时区索引值

谢谢,
我希望你觉得这有帮助:)

于 2012-12-07T00:39:46.077 回答
2

感谢 Picrofo EGY、esr 和 White Dragon,我创建了这个函数来解决它

public static DateTimeOffset CreateDateWithTimezone(string dateStr, TimeZoneInfo tzi)
{
  DateTimeOffset dtoTzi = TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, tzi);

  DateTimeOffset dto;
  if (!DateTimeOffset.TryParse(dateStr + " " + dtoTzi.ToString("zzz"), out dto))
    throw new Exception("Failed to parse date: " + dateStr + " " + dtoTzi.ToString("zzz"));

  if (tzi.SupportsDaylightSavingTime)
  {
    TimeSpan offset = tzi.GetUtcOffset(dto);
    string offsetStr = (offset.TotalHours < 0 ? "" : "+") + offset.Hours.ToString("00") + ":" + offset.Minutes.ToString("00");

    if (!DateTimeOffset.TryParse(dateStr + " " + offsetStr, out dto))
      throw new Exception("Failed to parse date: " + dateStr + " " + dtoTzi.ToString("zzz"));
  }

  return dto;
}

用法:

string dateStr = "1 December 2012, 08:00:00";
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
DateTimeOffset dtoUtc = CreateDateWithTimezone(dateStr, tzi).ToUniversalTime();

Response.Write("dtoUtc is " + dtoUtc);

它会打印出来

dtoUtc 是 2012 年 11 月 30 日晚上 9:00:00 +00:00

完美的!

于 2012-12-07T01:20:46.177 回答