C#和PowerShell中的非统一System.DateTime.Now默认格式
为什么在控制台上打印并写入文件时,不使用任何自定义格式就可以获得不同的日期时间格式(特别是对于日期分隔符斜杠和连字符) 即使使用同一个Dotnet的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
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)”
)的上下文中,它总是应用不变的区域性(通过设计),请参阅