日期时间字符串解析

发布于 2024-07-30 17:17:21 字数 298 浏览 4 评论 0原文

我制作了一个用于解析 ascii 文件的通用解析器。 当我想解析日期时,我使用 DateTime 对象中的 ParseExact 函数来解析,但我遇到了年份问题。

要解析的文本是“090812”,parseExact 字符串为“yyMMdd”。

我希望得到一个 DateTime 对象,说“12/8-2009”,但我得到“12/8-1909”。 我知道,我可以通过事后解析它来做出一个丑陋的解决方案,从而修改年份..

有人知道解决这个问题的聪明方法吗?

提前致谢

..Søren

I have made a generic parser for parsing ascii files.
When I want to parse dates, I use ParseExact function in DateTime object to parse, but I get problems with the year.

The text to parse is i.e. "090812" with the parseExact string "yyMMdd".

I'm hoping to get a DateTime object saying "12/8-2009", but I get "12/8-1909".
I know, that I could make an ugly solution by parsing it afterwards, and thereby modifying the year..

Anyone know of a smart way to solve this ??

Thanks in advance..

Søren

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

路弥 2024-08-06 17:17:21

理论上,执行此操作的优雅方法是:更改用于解析文本的 DateTimeFormatInfo 所使用的 CalendarTwoDigitYearMax 属性。 例如:

CultureInfo current = CultureInfo.CurrentCulture;
DateTimeFormatInfo dtfi = (DateTimeFormatInfo) current.DateTimeFormat.Clone();
// I'm not *sure* whether this is necessary
dtfi.Calendar = (Calendar) dtfi.Calendar.Clone();
dtfi.Calendar.TwoDigitYearMax = 1910;

然后在调用 DateTime.ParseExact 时使用 dtfi

实用的方法:将“20”添加到输入的开头,并使用“yyyyMMdd”进行解析。

Theoretically elegant way of doing this: change the TwoDigitYearMax property of the Calendar used by the DateTimeFormatInfo you're using to parse the text. For instance:

CultureInfo current = CultureInfo.CurrentCulture;
DateTimeFormatInfo dtfi = (DateTimeFormatInfo) current.DateTimeFormat.Clone();
// I'm not *sure* whether this is necessary
dtfi.Calendar = (Calendar) dtfi.Calendar.Clone();
dtfi.Calendar.TwoDigitYearMax = 1910;

Then use dtfi in your call to DateTime.ParseExact.

Practical way of doing this: add "20" to the start of your input, and parse with "yyyyMMdd".

如痴如狂 2024-08-06 17:17:21

好吧,如果您确定所有源日期都是本世纪,那么您可以对带有“20”前缀的源字符串使用 parseExact。

Well, if you're definite that all your source dates are this century, then you could use parseExact against a "20"-prefixed source string.

眼睛会笑 2024-08-06 17:17:21

您将需要确定某种适合您的数据的阈值日期。 如果解析的日期早于该日期,则添加 100 年。 一种安全的方法是在输入字符串中添加适当的世纪前缀。 在这个例子中,我选择了 1970 年作为截止时间:

string input = ...;
DateTime myDate;

if (Convert.ToInt32(input.Substring(0, 2)) < 70)
    myDate = DateTime.ParseExact("20" + input, ...);
else
    myDate = DateTime.ParseExact("19" + input, ...); 

Jon Skeet 还发布了一个使用 DateTimeFormatInfo 的很好的例子,我暂时忘记了:)

You will need to determine some kind of threshold date appropriate for your data. If the parsed date is before this date, add 100 years. A safe way to do that is to prefix the input string with the appropriate century. In this example I've chosen 1970 as the cutoff:

string input = ...;
DateTime myDate;

if (Convert.ToInt32(input.Substring(0, 2)) < 70)
    myDate = DateTime.ParseExact("20" + input, ...);
else
    myDate = DateTime.ParseExact("19" + input, ...); 

Jon Skeet also posted a nice example using DateTimeFormatInfo that I had momentarily forgotten about :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文