【问题标题】:DateTime Format - Any System Datetime.now to "DD/MM/YYYY hh:mm:ss"DateTime 格式 - 任何系统 Datetime.now 到 "DD/MM/YYYY hh:mm:ss"
【发布时间】:2019-09-27 10:35:41
【问题描述】:

我有一个程序可以做几件事。 其中两个是从 txt 中读取日期在同一个 txt 中重写日期

日期的读取是一个正则表达式,如:

[0-9]{2}/[0-9]{2}/[0-9]{4} [0-9]{2}:[0-9]{2}:[0-5]{1}[0-9]{1})

问题是我的正则表达式只适用于格式 "DD/MM/YYYY hh:mm:ss" 并且无法确保我的正则表达式可以匹配所有系统日期时间格式。

所以,我需要确保我的程序在每个系统中运行,无论系统 datetime.now 是什么。 为此,我在开始时考虑将每个系统 datetime.now 格式化为提到的格式“DD/MM/YYYY hh:mm:ss”。

目前我有以下代码:

Datetime currentDate = DateTime.ParseExact(DateTime.Now.ToString(), "DD/MM/YYYY hh:mm:ss", CultureInfo.InvariantCulture);

但是,在运行某些测试时,使用格式为“D/M/YYYY h:m:s”的系统日期时出现错误:

“字符串未被识别为有效的日期时间。”

问题是,例如,如果我的日期是“9/27/2019 04:26:46”(M/D/YYYY h:m:s),则它不符合我定义的格式。

有什么想法吗? 提前谢谢!

【问题讨论】:

  • 日期没有格式。它们是二进制值,就像整数一样。简单地删除该代码并使用var currentDate=DateTime.Now。格式仅在从值创建字符串或将字符串解析为值时使用
  • 你在做什么是毫无意义的......正如 Panagiotis 提到的 - DateTime 没有格式。只需使用DateTime.Now,然后在显示日期时使用您喜欢的格式。
  • Datetime currentDate = DateTime.ParseExact(DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture), "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture); 如果你坚持ToString / Parse
  • 也许真正的 问题是如何在表单、报告、网页、文件或用于显示日期的任何内容中显示日期?所有报告工具都允许设置格式或文化,所有 .NET 堆栈(Winforms、WPF、WebForms、MVC 等)都允许在绑定期间设置格式。数据注释属性允许您指定显示格式。在最坏的情况下,您可以使用String.Format() 以您想要的方式显示数据。
  • 您需要的是String currentDate = DateTime.Now.ToString( "dd/MM/yyyy hh:mm:ss", CultureInfo.InvariantCulture);。请记住 dd 和 yyyy 区分大小写

标签: c# .net


【解决方案1】:

您还需要在将DateTime 转换为字符串的每个地方都使用相同的格式字符串和区域性。在您的示例代码中,您正在做

DateTime.Now.ToString()

这使用线程的默认文化和默认格式。除非另有指定,否则该线程可能正在使用本地文化信息。相反,您可能希望使用相同的格式和不变的文化:

DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);

(注意小写“dd”。“DD”不是日期时间的有效格式说明符;这些内容区分大小写。还要注意“HH”,它给出的是 24 小时值,而不是 12 小时)

在实践中,仅仅使用不变的文化就足够持久了。文化已经包含默认的日期时间格式,所以除非您特别需要使用不同的格式,否则为什么不使用默认格式?

还要注意DateTime 没有格式。该格式仅在您转换为字符串或转换为字符串时才起作用。这就是您需要确保操作双方使用相同文化和格式的地方(这就是为什么对于持久性,特别是对于不同用户或计算机之间共享的数据,您通常希望使用不变文化)。

【讨论】:

  • 嘿卢安!我更新了我的问题,详细了解了是什么导致我尝试以该格式格式化每个系统日期时间。
  • @PythagorasDoe 问题的核心还是一样的——你必须改变日期时间的写入方式。在阅读端没有什么可以修复的。
【解决方案2】:

如果你需要

确保我的程序在每个系统中运行,无论系统 datetime.now

您可以为此调整国际标准,例如ISO 8601

为了验证DateTime,像你这样的正则表达式是不够的(想象一下闰年),但是TryParse可以做到:

 string source = "2019-09-26T23:45:59";

 // Either current culture date and time format or ISO
 bool isValid = DateTime.TryParse(
   source, 
   CultureInfo.InvariantCulture, 
   DateTimeStyles.AssumeLocal, 
   out var _date);

或者如果你想更严格地使用TryParseExact:

// ISO only
bool isValid = DateTime.TryParseExact(
  source, 
 "s",
  CultureInfo.InvariantCulture, 
  DateTimeStyles.AssumeLocal, 
  out var _date);

如果要在ISO 8601中表示DateTime.Now,请添加"s"标准格式字符串:

 string dateAsString = DateTime.Now.ToString("s");

唉,你可以提供一堆能够处理任何日期和时间格式的格式; 模糊日期的经典例子是

 01/02/03 - 01 Feb 2003 (Russia)
 01/02/03 - 02 Jan 2003 (USA)
 01/02/03 - 03 Feb 2001 (China)

您可以缓解问题,同时提供几个 formats:

 // Here we try to support 4 formats (note different delimeters)
 string[] formats = new string[] {
   "s",                            // try ISO first
   "dd'.'MM'.'yyyy HH':'mm':'ss",  // if failed try Russian
   "MM'/'dd'/'yyyy HH':'mm':'ss",  // on error have a look at USA
   "yyyy'-'MM'-'dd HH':'mm':'ss",  // the last hope is Chinese
 };

 bool isValid = DateTime.TryParse(
   source, 
   formats,
   CultureInfo.InvariantCulture, 
   DateTimeStyles.AssumeLocal, 
   out var date);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-09
    • 2013-03-21
    • 2012-11-20
    • 2016-12-13
    • 2015-11-03
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    相关资源
    最近更新 更多