【发布时间】:2017-11-10 08:55:19
【问题描述】:
我在时区遇到问题。现在我正在从客户端保存时区并将所有 DateTime 存储在 UTC 中。它工作正常,但是当我尝试将 DateTime 转换为 CST、EST、EDT 等时区之后的 UTC 时,它显示错误的数据。
问题 - 假设我在美国东部时间晚上 10 点执行了任何任务,并且它将作为凌晨 2 点(根据 UTC)保存在 DB 中,但是当我尝试获取一天的数据并通过当前 UTC 日期时。
我的问题是,如果我试图获取像午夜 11 点(从 EST 开始)到当前时间的一天的数据,但是由于 UTC 12midnight 是昨天的晚上 8 点(美国东部时间 4 小时后),我从 UTC 到 EST 的转换是错误的世界标准时间)。 (从日期 [UTC 转换为 EDT] - 06/07/2017 08:00 pm)和 To Date - 06/07/2017 11:00 pm)由于这种转换,我仅从晚上 8 点到晚上 11 点获取数据
代码 - 下面是转换代码。从日期开始,我只使用了 utcnow.date 和日期
Javascript 代码 -
function setTimezoneCookie() {
try {
var timezone_cookie = "timezoneoffset";
var timeZoneName = "timezonename"
var tz = jstz.determine();
var aa = tz.name();
// if the timezone cookie not exists create one.
if (!$.cookie(timezone_cookie)) {
// create a new cookie
$.cookie(timezone_cookie, new Date().getTimezoneOffset());
$.cookie(timeZoneName, aa);
}
else {
var storedOffset = parseInt($.cookie(timezone_cookie));
var currentOffset = new Date().getTimezoneOffset();
if (storedOffset !== currentOffset) {
$.cookie(timezone_cookie, new Date().getTimezoneOffset());
$.cookie(timeZoneName, aa);
location.reload();
}
else {
$.cookie(timeZoneName, aa);
}
}
}
c#代码-
fromDate =Convert.ToDateTime(fromDate).ToClientTimeZoneinDateTime().ToString();
toDate = Convert.ToDateTime(toDate).ToClientTimeZoneinDateTime().ToString();
ObjectParameter totalRecords = new ObjectParameter("TotalRecords", typeof(int));
var DetailsList = objDetailsList.GetDetails(loginUserId,locationId, userId, taskType, pageIndex, numberOfRows, sortColumnName, sortOrderBy, textSearch, totalRecords, fromDate, toDate);
if (DetailsList.Count() > 0)
{
string output = BuildJQGridResults(DetailsList, numberOfRows, pageIndex, Convert.ToInt32(totalRecords.Value));
response.Write(output);
}
else
{
JQGridResults result = new JQGridResults();
List<JQGridRow> rows = new List<JQGridRow>();
result.rows = rows.ToArray();
result.page = 0;
result.total = 0;
result.records = 0;
response.Write(new JavaScriptSerializer().Serialize(result));
}
以下是将UTC时间转换为客户端时区的方法
public static DateTime ToClientTimeZoneinDateTime(this DateTime dt)
{
try {
if (System.Web.HttpContext.Current.Request.Cookies["timezoneoffset"] != null || System.Web.HttpContext.Current.Request.Cookies["timezonename"] != null)
{
var timezonename = System.Web.HttpContext.Current.Request.Cookies["timezonename"].Value;
timezonename = timezonename.Replace("%2F", "/");
var timezoneLocal1 = FindTimezoneName(timezonename);
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(timezoneLocal1);
bool isCurrentlyDaylightSavings = tzi.IsDaylightSavingTime(dt);
if (isCurrentlyDaylightSavings == true)
dt.AddHours(1);
var timeOffSet = System.Web.HttpContext.Current.Request.Cookies["timezoneoffset"].Value;
var offset = int.Parse(timeOffSet.ToString());
dt = dt.AddMinutes(-1 * offset);
return dt;
}
return dt.ToLocalTime();
}
catch (Exception)
{
return DateTime.UtcNow;
}
}
毫无疑问,时区处理得当,但如果最终用户尝试在美国东部时间晚上 8 点之后获取数据,则会面临 UTC 时区滞后的问题。我也附上了截图。
我需要如何处理这种情况?
【问题讨论】:
-
能否提供minimal reproducible example的代码,以及
DateTime的转换? -
听起来您的查询使用了错误的日期。请记住,查询中的日期也应该是 UTC。发布一些示例代码以获得更好的答案。
-
在大多数情况下,当数据以 UTC 存储时,实际上需要执行 范围查询 以拉回相对于 本地 日期的数据.如果您想要更好的答案,您需要向我们展示一个完整的示例。
-
另外,这与 asp.net 或 MVC 有什么关系?听起来这是您的应用程序层和数据库之间的查询问题。
标签: javascript c# asp.net-mvc timezone