C#和PowerShell中的非统一System.DateTime.Now默认格式

C#和PowerShell中的非统一System.DateTime.Now默认格式,c#,.net,file,powershell,datetime,C#,.net,File,Powershell,Datetime,为什么在控制台上打印并写入文件时,不使用任何自定义格式就可以获得不同的日期时间格式(特别是对于日期分隔符斜杠和连字符) 即使使用同一个Dotnet的System.DateTime.Now,我也看到了C#与PowerShell输出的差异 [System.DateTime]::Now.ToString() 以下是我对C#和Powershell的观察结果: 控制台上的C# 2018年8月6日02:01:11上午 C#-写入文件 2018年8月6日下午2:02:32 PowerShell-[Syste

为什么在控制台上打印并写入文件时,不使用任何自定义格式就可以获得不同的日期时间格式(特别是对于日期分隔符斜杠和连字符)

即使使用同一个Dotnet的
System.DateTime.Now
,我也看到了C#与PowerShell输出的差异

[System.DateTime]::Now.ToString()
以下是我对C#和Powershell的观察结果:

控制台上的C#

2018年8月6日02:01:11上午

C#-写入文件

2018年8月6日下午2:02:32

PowerShell-[System.DateTime]::现在-在控制台上

2018年8月6日上午01:54:45

PowerShell-[System.DateTime]::Now.ToLocalTime()-在控制台上

2018年8月6日上午01:54:53

PowerShell-获取日期-在控制台上

2018年8月6日凌晨01:54:57

PowerShell-[System.DateTime]::现在-写入文件

2018年08月06日01:46:35

我最好奇的是在同一个系统中观察到的C#和PowerShell写入文件的情况。

还有一点需要注意——我还看到在不同的系统上运行相同的exe时,C#的连字符变为斜杠。我不知道为什么会发生这种情况,也因此导致了一些例外。我必须使用明确的日期时间格式来解决这个问题

在处理日期时间格式时有什么最佳做法吗?

============================更新====================================

根据@mjwills的建议:

我发现,在PowerShell中显式使用Tostring()时,即使通过PowerShell写入文件,在C#和PowerShell中的行为也会保持一致

[System.DateTime]::Now.ToString()
C#默认情况下会通过调用
ToString
(通常会导致)将
DateTime
转换为
string

Powershell不会这么做。根据:

默认情况下,日期时间以长日期和长时间显示 系统区域设置的格式

如果在将
DateTime
输出为
string
时需要一致、明确的格式,则必须始终使用明确的日期和时间格式字符串(例如)。

C#默认情况下会通过调用
ToString
DateTime
转换为
string
(这通常会导致错误)

Powershell不会这么做。根据:

默认情况下,日期时间以长日期和长时间显示 系统区域设置的格式


如果在将
DateTime
输出为
string
时需要一致、明确的格式,则必须始终使用明确的日期和时间格式字符串(例如)。

.ToString()的隐式调用
是在将
系统.DateTime
实例从C#程序传递到
控制台.WriteLine()时生成的

相比之下,PowerShell有自己的输出格式系统,如中所述:

  • 输出格式由输出对象的数据类型选择
  • 常用的.NET类型具有预定义的格式

    • 在本例中,
      System.DateTime
      ,定义了输出格式。
      • 对于默认的
        System.DateTime
        实例,这相当于(假设
        $dt
        作为手头的实例):
        “{0}{1}”-f$dt.ToLongDateString(),$dt.ToLongTimeString()
  • 但是,在给定类型没有输出格式定义的情况下,PowerShell确实依赖于
    .ToString()


如果希望两种情况下的输出一致,请在PowerShell中显式调用
.ToString()

(Get-Date).ToString()
警告

  • .ToString()
    输出基于当前区域性的格式表示(如果类型支持)

  • 相比之下,当PowerShell使用隐式字符串化时,例如在可扩展字符串(带插值的字符串,
    “…”
    ;例如,
    “$(Get Date)”
    )的上下文中,它总是应用不变的区域性(通过设计)
    ,请参阅


当您将
系统.DateTime
实例从C>程序传递到
控制台.WriteLine()
时,会隐式调用
.ToString()

相比之下,PowerShell有自己的输出格式系统,如中所述:

  • 输出格式由输出对象的数据类型选择
  • 常用的.NET类型具有预定义的格式

    • 在本例中,
      System.DateTime
      ,定义了输出格式。
      • 对于默认的
        System.DateTime
        实例,这相当于(假设
        $dt
        作为手头的实例):
        “{0}{1}”-f$dt.ToLongDateString(),$dt.ToLongTimeString()
  • 但是,在给定类型没有输出格式定义的情况下,PowerShell确实依赖于
    .ToString()


如果希望两种情况下的输出一致,请在PowerShell中显式调用
.ToString()

(Get-Date).ToString()
警告

  • .ToString()
    输出基于当前区域性的格式表示(如果类型支持)

  • 相比之下,当PowerShell使用隐式字符串化时,例如在可扩展字符串(带插值的字符串,
    “…”
    ;例如,
    “$(Get Date)”
    )的上下文中,它总是应用不变的区域性(通过设计)
    ,请参阅