我有一个程序可以做几件事。 其中两个是从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);