gpt4 book ai didi

c# - 围绕 utc 日期的问题 - TimeZoneInfo.ConvertTimeToUtc 导致日期更改

转载 作者:可可西里 更新时间:2023-11-01 08:29:56 25 4
gpt4 key购买 nike

如果用户选择提前 x 小时的时区,我希望保存的日期会从屏幕上选择的日期发生变化。例如。他们从日历弹出窗口中选择 UTC+2 Athens 和日期 25/02/2016,然后记录的日期将是 24/02/2016。我已经将推理范围缩小到这样一个事实,即所选日期时间被记录为例如 25/02/2016 00:00:00 并且有 2 小时的偏移量,这将它带到 24/02/2016 22:00:00以前从未使用过时区或 UTC 日期/时间,这非常令人困惑。

这是代码-

     oObject.RefDate = itTimeAndDate.ParseDateAndTimeNoUTCMap(Request, TextBox_RefDate.Text);
if (!string.IsNullOrEmpty(oObject.TimeZoneDetails))
{
TimeZoneInfo oTimeZone = TimeZoneInfo.FindSystemTimeZoneById(oObject.TimeZoneDetails);
oObject.RefDate = itTimeAndDate.GetUTCUsingTimeZone(oTimeZone, oObject.RefDate);
}

RefDate 等同于 25/02/2016 00:00:00 一旦从 ParseDateAndTimeNoUTCMap 返回 *(下面的代码)*

static public itDateTime ParseDateAndTimeNoUTCMap(HttpRequest oTheRequest, string sValue)
{
DateTime? oResult = ParseDateAndTimeNoUTCMapNull(oTheRequest, sValue);
if (oResult != null)
return new itDateTime(oResult.Value);
return null;
}

/// <summary>
/// Translate a string that has been entered by a user to a UTC date / time - mapping using the
/// current time zone
/// </summary>
/// <param name="oTheRequest">Request context</param>
/// <param name="sValue">Date / time string entered by a user</param>
/// <returns>UTC date / time object</returns>
static public DateTime? ParseDateAndTimeNoUTCMapNull(HttpRequest oTheRequest, string sValue)
{
try
{
if (string.IsNullOrEmpty(sValue))
return null;
sValue = sValue.Trim();
if (string.IsNullOrEmpty(sValue))
return null;

if (oTheRequest != null)
{
const DateTimeStyles iStyles = DateTimeStyles.AllowInnerWhite | DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowTrailingWhite;
// Create array of CultureInfo objects
CultureInfo[] aCultures = new CultureInfo[oTheRequest.UserLanguages.Length + 1];
for (int iCount = oTheRequest.UserLanguages.GetLowerBound(0); iCount <= oTheRequest.UserLanguages.GetUpperBound(0);
iCount++)
{
string sLocale = oTheRequest.UserLanguages[iCount];
if (!string.IsNullOrEmpty(sLocale))
{

// Remove quality specifier, if present.
if (sLocale.Contains(";"))
sLocale = sLocale.Substring(0, sLocale.IndexOf(';'));
try
{
aCultures[iCount] = new CultureInfo(sLocale, false);
}
catch (Exception) { }
}
else
{
aCultures[iCount] = CultureInfo.CurrentCulture;
}
}
aCultures[oTheRequest.UserLanguages.Length] = CultureInfo.InvariantCulture;
// Parse input using each culture.
foreach (CultureInfo culture in aCultures)
{
DateTime oInputDate;
if (DateTime.TryParse(sValue, culture.DateTimeFormat, iStyles, out oInputDate))
return oInputDate;
}
}
return DateTime.Parse(sValue);
}
catch (Exception)
{
}
return null;
}

从上面返回后,将执行以下行 -

TimeZoneInfo oTimeZone = TimeZoneInfo.FindSystemTimeZoneById(oObject.TimeZoneDetails);
oObject.RefDate = itTimeAndDate.GetUTCUsingTimeZone(oTimeZone, oObject.RefDate);

我似乎在 GetUTCUsingTimeZone 中遇到了这个问题。

static public itDateTime GetUTCUsingTimeZone(TimeZoneInfo oTimeZone, itDateTime oDateTime)
{
if (oDateTime == null || oTimeZone == null)
return oDateTime;
DateTime oLocal = DateTime.SpecifyKind(oDateTime.Value, DateTimeKind.Unspecified);
DateTime oResult = TimeZoneInfo.ConvertTimeToUtc(oLocal, oTimeZone);

return new itDateTime(oResult);
}

我已经检查了 TimezoneInfo 的偏移值,oResult 始终等于 oLocal param - 偏移量。所以 25/02/2016 00:00:00 有 3 小时的偏移将等同于 24/02/2016 21:00:00当偏移量为 -hours 时,它直接进入另一个方向,所以 oResult = oLocal + the offset,如果这样的话。因此,在这些情况下不会发生日期更改的主要问题。

显然这不是我想要的。我希望日期是用户为他们的时区选择的日期。有没有人见过这样的事情?有什么可能的解决方案吗?

我不完全确定我做错了什么。

最佳答案

如果您需要维护正确的时区,您应该使用 DateTimeOffset 类型而不是 DateTime 类型。

DateTimeOffset 保持与 UTC 的偏移量,因此您永远不会丢失时区信息,并且有很多有用的方法,例如UtcDateTime

出自马口:

https://msdn.microsoft.com/en-us/library/system.datetimeoffset(v=vs.110).aspx

https://learn.microsoft.com/en-us/dotnet/standard/datetime/choosing-between-datetime

关于c# - 围绕 utc 日期的问题 - TimeZoneInfo.ConvertTimeToUtc 导致日期更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35604487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com