【问题标题】:`DateTime.Parse` parses the timestamp in which timezone?`DateTime.Parse` 解析哪个时区的时间戳?
【发布时间】:2019-05-09 06:35:57
【问题描述】:

我正在使用DateTime.Parse 方法解析字符串时间。它会正确解析并以输入的时间返回我今天的日期。但是我无法确定日期部分的时区。是考虑本地日期还是UTC日期?

public class Program
{
    public static void Main(string[] args)
    {
        //Your code goes here
        Console.WriteLine(DateTime.Parse("4:00"));
        //prints 09.05.2019 04:00:00 - here did it take 09.05.2019 from local timezone or is it UTC?
    }
}

在提及DateTime.Parse的官方documentation时,含糊其辞如下:

带有时间但没有日期组件的字符串。该方法假定当前日期,除非您调用 Parse(String, IFormatProvider, DateTimeStyles) 重载并在样式参数中包含 DateTimeStyles.NoCurrentDateDefault,在这种情况下,该方法假定日期为 0001 年 1 月 1 日。

我很困惑选择日期的确切文化是什么?

【问题讨论】:

  • 获取执行机器的时区
  • 您可以随时查看源代码referencesource.microsoft.com/#mscorlib/system/…(与大多数其他方法不同,Parse 并不是最直接的代码)
  • 它使用Thread.CurrentThread.CurrentCulture 作为参考。使用Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR"); 更改它,它将以法语格式显示日期/时间。指定 IFormatProvider(在 DateTime.Parse("value", [IFormatProvider]) 中)不会改变结果。时间是您输入的数字

标签: c# .net datetime parsing


【解决方案1】:

不是,是Unspecified

首先,在 .NET Framework 中,DateTime structure保留时区信息。它有 Kind 属性,它反映了一些信息,如 UtcLocalUnspecified,但它们完全是指时区。

在您的情况下,由于您不提供任何其他参数,因此您的结果DateTime 将是Unspecified

documentation上注明为;

如果s包含时区信息,该方法返回一个DateTime 其 Kind 属性为 DateTimeKind.Local 的值并转换日期 和时间在 s 到本地时间。 否则不执行时区 转换并返回一个 DateTime 值,其 Kind 属性为 DateTimeKind.Unspecified。

对于表示部分,当您在Console.WriteLine 方法中使用DateTime 时,它会调用WriteLine(object) overload,而这个calls 是当前的FormatProvider,即came fromThread.CurrentThread.CurrentCulture

【讨论】:

  • 感谢您的回答。我仍然很困惑。如果我想显示本地时区的日期部分怎么办?我应该更改评论中提到的 CurrentCulture 还是需要更改 DateTime 类型?
  • @KaranDesai 我不确定“显示我当地时区的日期部分”是什么意思。你想将此Unspecified 转换为LocalKind 吗?如果是这样,您可以调用ToLocalTime 方法。更改文化设置会影响您的 DateTime 将“如何”表示为 textual(又名字符串)。
【解决方案2】:

默认情况下,它会选择系统当前活动的区域性(在其上执行 C# 代码)本地日期及其格式,然后将您的时间附加到该日期。由于您的时间只有一个数值,即 4,因此它会将其列为凌晨 4 点。

因此输出可能类似于09.05.2019 04:00:005/9/2019 4:00:00 AM,具体取决于执行代码的服务器系统当前格式。您可以通过在 Windows 任务栏中右键单击时间并查看格式来查看系统当前的文化。

【讨论】:

    猜你喜欢
    • 2021-07-25
    • 1970-01-01
    • 2015-08-03
    • 2021-09-24
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 2021-12-18
    相关资源
    最近更新 更多