繁体   English   中英

C#,字符串日期,时区,夏令时

[英]C#, date from string, time zone, daylight savings

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

我知道现在是AEST时间(无论服务器在哪里),当时(夏令时)处于任何夏令时状态,但是我想将它存储为UTC时间。

我如何将其转换为UTC,而不管服务器在哪里,都将字符串视为AEST?

假设您可以使用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

您可以首先初始化一个System.DateTime ,它从上面指定的字符串中获取DateTime 然后,您可以使用System.DateTime.ToUniversalTime()将当前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是您想要转换的DateTimesourceTimeZone是时区您要转换的DateTime中的DateTime ,而destinationTimeZone是您要从dateTime获取的时区

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  

假设其时区是机器的本地时区(例如, Egypt Standard Time: (GMT+02:00) Cairo ),它将转换为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时区索引值

谢谢,
我希望这个对你有用 :)

感谢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是30/11/2012 9:00:00 PM +00:00

完善!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM