C#DateTime.ToString()方法是否存在时区问题?

时间:2019-02-06 07:14:15

标签: c# datetime

我的服务器处于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

2 个答案:

答案 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

时将获得调整后的DateTime。

这可以通过使用UtcTime进行纠正。

  

DateTime.UtcNow;