【问题标题】:c# .net core difference in date format MMM on Windows and Linuxc# .net core 在 Windows 和 Linux 上日期格式 MMM 的区别
【发布时间】:2019-08-29 12:17:32
【问题描述】:

我遇到了一个问题。我需要以西里尔文的特定格式 ddMMMyy 解析日期。当我在 Windows 上运行 .net 核心应用程序时,日期 08АПР19 正确解析为 2019-04-08 但是当我在 Linux 服务器上解析它时会抛出异常 例外:字符串“08АПР19”未被识别为有效的日期时间。

导致异常的代码如下:

DateTime.ParseExact(myDateVar, "ddMMMyy", CultureInfo.CreateSpecificCulture("ru-RU"));

然后我尝试在 Windows 和 Linux 上输出以下内容:

DateTime.Now.ToString("ddMMMyy", CultureInfo.CreateSpecificCulture("ru-RU"))

Windows 上的输出: 08апр19

和 Linux: 08Апр.19 Linux 上有一个奇怪的点

在我理解的 .net 框架中硬编码的格式中,我想知道为什么它依赖于平台。那么问题来了,Win 和 Linux 机器有什么不同,谁造成了这个问题?

【问题讨论】:

  • 哪个 OS/.NET 版本?这可能是 OS 为这种文化返回的内容,或者可能已修复的 .NET Core CultureInfo 问题
  • 它是 CentOS 7 上的 .net core 2.1
  • 我在 Debian 和 el-GR 文化的 Core 3.1 上看到了类似的问题。 Windows 中的 AM/PM 指示符与 linux 中的不同。

标签: c# linux windows .net-core date-format


【解决方案1】:

当您在与操作系统相连的 .NET Framework(与 Core 相同)中调用任意命名空间的函数或方法时,.NET Framework 会调用操作系统的 API 函数。然后 .NET 获取操作系统返回的一些值并将其返回给您。因此,在不同的操作系统中,您会得到不同的结果。

例如,假设 GetProccessorType()(仅示例)是 WIndows OS 的 DLL 函数,get_cpu_type()(仅示例)是 Linux 的相同函数。它们都返回处理器类型。但是假设如果 CPU 是 32 位,GetProcessorType 返回 0,如果 CPU 是 64 位,则返回 1。但是在 Linux 中 get_cpu_type 如果是 32 位则返回 32,如果是 64 位则返回 64。

现在假设 .NET Framework 在 Linux 和 Windows 中都有一个函数 GetCPUMode()(实际上 .NET Framework 没有它,只是一个例子)(你应该已经知道了)。

当你在windows中调用函数时

....
public static void Main(){
    Console.WriteLine(GetCPUMode());
}
....

如果您的 PC 是 64 位,那么在 Windows 中将显示 1 作为输出,在 Linux 中将显示 64 作为输出。我认为您将不得不使用辅助解析方法来删除点。为此,您可以查看字符串操作方法。

【讨论】:

  • 我理解这个逻辑,但我也试过'date'命令,输出没有多余的点,所以它似乎不是Linux格式,对我来说仍然很奇怪
  • 很神秘
  • 尝试导入 Microsoft.VisualBasic 命名空间,然后调用 Replace(str, "Amp.", "amp")。这将返回删除点的字符串
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多