我的服务器处于UTC时区,而我的本地系统处于另一个时区。我有一个datetime对象,指向特定日期的第一秒,例如2018年1月7日,即07-01-2019 00:00:00
。如果我在此对象上调用toString(“ dd MMM yyyy”)方法并将其返回到本地系统并显示,我观察到日期已经过一天了,显示为2019年1月6日。请您解释一下为什么会这样所以?
编辑:最初,我问这个问题的目的是要了解dateTime.ToString()方法是否存在任何明显的问题。有人可以向我解释为什么这种行为方式如此吗?
我对问题的测试表明,仅当托管网页的服务器和与网页进行交互的客户端位于不同时区时,才可以重现该错误。我的客户端在IST中,服务器在UTC中。假设我分别选择2019年1月29日和2019年2月7日作为开始和结束日期。
客户端将以下内容作为参数发送到API。通过切换到不同的时区,我注意到发送的参数仅采用UTC。
fromDate: "2019-01-28T18:30:00.000Z"
toDate: "2019-02-06T18:30:00.000Z"
API接受它们并执行以下操作
{
DateTime utcStart = DateTime.SpecifyKind(Convert.ToDateTime(fromDate),
DateTimeKind.Unspecified);
DateTime utcEnd = DateTime.SpecifyKind(Convert.ToDateTime(toDate),
DateTimeKind.Unspecified);
dummyMethod(utcStart,utcEnd,true, null, out strDuration);
}
dummyMethod(DateTime? fromDate, DateTime? toDate, Boolean convertToUTC, int? timeZoneKey, out string displayString)
{
DateTime centerStartDate = GetCurrentTime(timeZoneKey).Date;
DateTime centerEndDate = GetCurrentTime(timeZoneKey).Date;
if (fromDate.HasValue)
centerStartDate = fromDate.Value.Date;
if (toDate.HasValue)
centerEndDate = toDate.Value.Date;
displayString = centerStartDate.ToString("dd MMM yyyy") + " - " + centerEndDate.ToString("dd MMM yyyy");
}
displayString是通过JSON直接返回的,而displayString似乎是哪里出错了。
TIA
答案 0 :(得分:0)
如果要获取服务器/ Utc日期,则必须致电:
DateTime.UtcNow
答案 1 :(得分:0)
这是因为DateTime实际上存储了来自MSDN的00:00:00 01-01-0001 A.D.起的滴答声:
一个特定的日期是自公历0001年1月1日午夜12:00(自公元)以来的滴答数。
因此,DateTime对象将具有单位滴答的UtcTime,并且当您在本地系统中收到它时,在打印b
这可以通过使用UtcTime进行纠正。
DateTime.UtcNow;