【问题标题】:C# Object containing datetime and specific cultureinfo to be fully compatible with Excel datetime cell包含日期时间和特定区域性信息的 C# 对象与 Excel 日期时间单元格完全兼容
【发布时间】:2020-05-02 13:03:40
【问题描述】:

当我尝试将 excel 文件导入 C# 对象时,我注意到到目前为止,创建包含特定区域性信息和特定单元格的日期时间格式的 dateTime 类型的唯一方法是转换为字符串。

例如可以实例化:

var date = new DateTime(DateTime.Now.Ticks, DateTimeKind.Unspecified);
var culturedDateString = date.ToString(specifiedCulture);

但我还没有看到任何可以同时包含日期时间值以及 Excel 单元格可能包含的特定cultureInfo 和日期时间格式的 c# 对象。

请让我知道 c# 中是否有任何等效类型可以同时包含 dateTime 和特定文化信息,包括 datetimeFormat。否则我需要考虑采取不同的方法。

【问题讨论】:

  • 如果谁投票支持关闭,我希望有人比我更了解我在 C# 类型中看到的限制。使用 DateTime 或任何其他 C# 类型的问题在于,没有可以包含特定cultureInfo 的对象的等效对象,因此稍后可以将此类型恢复为所需的字符串表示形式,就像Excel 保存值的方式一样。目前没有可能的两种方式从具有特定文化格式或 Excel 日期值的日期时间的字符串表示形式 -> C# 类型 -> 返回值
  • 关于上面的链接,您需要了解该字符串表示是 mm/dd/yyyy 还是 dd/mm/yyyy 格式(Parse 或 TryParse 的第一个参数)。 Excel 中的某些对象包含该信息,以便您可以转换解释特定的cultureInfo。尝试将特定的cultureInfo 保存为 DateTime 类型。让我知道是否有任何 C# 类型可以支持它。否则充其量创建一个自定义类型并以某种方式包含文化信息然后我需要弄清楚该类型在整个系统中的转换(数据集,到数据库,回到对象层等)
  • 您应该从您正在使用的 Excel 库中获取一个 DateTime 对象。您应该将该 DateTime 放入数据库中,并仅在屏幕上打印该日期时转换为字符串。除非允许用户编辑日期,否则您通常永远不会将字符串解析为 DateTime。
  • 这就是为什么在上面的线程中提到了特定的自定义类型来包含特定的文化信息。您还能如何将正确的导出 Excel 文件从您的数据库返回给用户(包括任何日期时间值的正确文化格式)?例如,一旦在数据库中保存为字符串,当您尝试检索返回以导出为 Excel 数据时,无法知道它是 dd/mm/yyyy 还是 mm/dd/yyyy。

标签: c# datetime datetime-format


【解决方案1】:

.NET 中没有嵌入 DateTime 和 CultureInfo 的类型。但是你可以自己做一个:

public class DateTimeAndCultureInfo {
    public DateTime DateTime { get; set; }
    public CultureInfo CultureInfo { get;set; }
}

但是,当您从 Excel 库中获取日期时,这种类型可能不会有太大帮助,因为 Excel 不(完全)依赖 CultureInfo 来呈现其单元格。 Excel 在内部使用自己的数字格式字符串,如下所述:

https://support.office.com/en-us/article/available-number-formats-in-excel-0afe8f52-97db-41f1-b972-4b46e9f1e8d2

.NET 支持自己的数字格式字符串,与 Excel 的数字格式字符串类似,但不兼容:

https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings

通常您需要三个单独的信息来显示一个值:原始值、数字格式字符串和 CultureInfo。

CultureInfo 存储基本内容,如小数分隔符、千位分隔符、货币符号、默认长/短日期格式和其他特定于区域设置的内容,但从技术上讲,它不控制值在屏幕上的显示方式。

CultureInfo 通常对您的应用程序是全局的,f.ex 取自配置或操作系统,并指示应用程序运行的总体语言/国家/地区。您很少希望将 CultureInfo 与每个 DateTime 实例捆绑在一起。

使用何种数字格式字符串可能取决于用例:有时您可能希望显示较短的日期(如列表中的“01-01-2020”),有时您可能希望显示较长的日期同一日期(如概览中的“2020 年 1 月 1 日”)。

其他时候,您可能希望像 Excel 一样呈现电子表格。在这些情况下,将原始单元格值和数字格式字符串视为单一​​类型 f.ex:

public class Cell {
    public object Value { get; set; }
    public string FormatString { get;set; }
}

.NET 提供了可以根据需要使用日期/值的各个部分,但是您必须自己编写代码以根据用例将它们粘合在一起,这可能会有很大差异。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 2013-09-15
  • 2021-05-10
  • 1970-01-01
  • 2021-06-15
  • 2017-03-08
  • 1970-01-01
相关资源
最近更新 更多