C# C、 来自字符串、时区、夏令时的日期

C# C、 来自字符串、时区、夏令时的日期,c#,datetime,timezone,C#,Datetime,Timezone,假设我有字符串2012年12月1日8:00:00 我知道现在是AEST时间,无论服务器在哪里,12月1日的夏时制状态如何,但我想将其作为UTC存储在数据库中 如何将其转换为UTC,将字符串视为AEST,而不管服务器位于何处?您可以首先初始化System.DateTime,它从上面指定的字符串中获取日期时间。然后,您可以使用System.DateTime.ToUniversalTime,它将当前System.DateTime对象的值转换为协调世界时,并将其存储在数据库中 范例 注意:如果您愿意将时

假设我有字符串2012年12月1日8:00:00

我知道现在是AEST时间,无论服务器在哪里,12月1日的夏时制状态如何,但我想将其作为UTC存储在数据库中


如何将其转换为UTC,将字符串视为AEST,而不管服务器位于何处?

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

范例

注意:如果您愿意将时间从一个时区转换为另一个时区,则可以使用TimeZoneInfo.ConvertTimeDateTime dateTime、TimeZoneInfo sourceTimeZone、TimeZoneInfo、destinationTimeZone,其中dateTime是要转换的日期时间,sourceTimeZone是要转换的日期时间的时区,destinationTimeZone是要从DateTime获取的时区

范例

这将转换为2012年12月1日8:00:00,假设其时区是机器的本地时区,例如埃及标准时间:GMT+02:00开罗到西澳大利亚标准时间:GMT+08:00珀斯,即2012年1月12日下午2:00:00

有关时区列表,请参见

谢谢,
我希望这对您有所帮助:

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

多亏了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;
}
它会打印出来的

dtoUtc为2012年11月30日9:00:00 PM+00:00


太好了

看看它可能会有帮助。使用TimeZoneInfo类。您需要使用时区的全称,它是澳大利亚东部标准时间。网站如何知道该字符串是AEST格式的?服务器可以是anywhere@aximiliAEST只是一个变量,用于使用DateTime.Parsestring s从字符串中获取有效的DateTime对象。我真的不认为时间必须用AEST来解析。祝您度过愉快的一天:这意味着它可以根据服务器位置提供不同的结果。无论服务器在哪里,我都需要将字符串视为AEST。@aximili我已经更新了答案!我希望你能尽快解决你的问题。祝你度过愉快的一天:然后你需要解析日期,从你的时区中添加或减去偏移量以匹配AEST,然后调用ToUniversalTime@aximili:我将介绍解析上述日期。要增加或减少小时数,请调用DateTime.AddHours,很少调用AddMinutes。或者你是在问如何计算加/减多少小时?
DateTime dt;
DateTime utcDate;
if (DateTime.TryParse(dateTimeString, out dt))
{
    utcDate = dt.ToUniversalTime();
    // store utcDate in database
}
else
{
    // error, unable to parse the date
}
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);