日期时间格式 - 任何系统 日期时间.现在到"DD/MM/YYYY hh:mm:ss"



我有一个程序可以做几件事。 其中两个是从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,现在,开始,格式为提到的格式"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(,它就不适合我定义的格式。

知道吗? 提前谢谢你!

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

DateTime.Now.ToString()

这将使用线程的默认区域性和默认格式。除非另有分配,否则线程可能正在使用本地区域性信息。相反,您可能希望使用相同的格式和固定区域性:

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

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

实际上,仅使用固定区域性就足以实现持久性。区域性已经包含默认日期时间格式,因此除非您特别需要使用其他格式,否则为什么不使用默认格式?

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

如果你需要

确保我的程序在每个系统中运行,无论系统日期时间如何。

您可以为此调整国际标准,例如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);

最新更新