【问题标题】:Can DateTime.ParseExact create 1 year from 01 instead of 2001 with yy?DateTime.ParseExact 可以用 yy 从 01 而不是 2001 创建 1 年吗?
【发布时间】:2015-03-11 21:37:23
【问题描述】:

我正在尝试将两位数的年份解析为两位数 int 但下面的代码给了我 2001:

var date = DateTime.ParseExact("29NOV01", "ddMMMyy", CultureInfo.InvariantCulture)

var year = date.Year; // .ToString("D4") = 2001 instead of 0001

有没有办法改变这种行为?我宁愿不要在字符串中添加另外两个零只是为了使它工作。

【问题讨论】:

标签: c# datetime


【解决方案1】:

如果有两位数字,则使用的世纪包含在CultureInfo中:

var culture = (CultureInfo)CultureInfo.InvariantCulture.Clone();
culture.Calendar.TwoDigitYearMax = 100;
DateTime dt = DateTime.ParseExact("29NOV99", "ddMMMyy", culture);

记住这一点:

DateTime dt = DateTime.ParseExact("01JAN00", "ddMMMyy", culture);

将被解析为 0100 年 1 月 1 日。或者您可以

culture.Calendar.TwoDigitYearMax = 99;

但是ParseExact 会抛出异常,因为日期 0000 年 1 月 1 日不能用 DateTime 表示(有 MinValue 0001 年 1 月 1 日)

【讨论】:

  • @SonerGönül 0099 年 11 月 29 日,应要求 (.ToString("D4") = 2001 instead of 0001)
  • 感谢您的精彩解释。我发现这种方法不是很可靠,我的问题的答案是不,它不能,因为它不适用于所有值。毕竟,我想我最好将两个零添加到年份中。这样它总是会产生正确的结果,因为我不能保证年份总是在这个范围内。
  • @t3chb0t 我提出的解决方案有问题吗?
【解决方案2】:

DateTime 结构存储实际年份,而不是它在解析您提供的任何字符串时找到的值。

如果您只想要没有世纪的部分,为什么不这样做:

var date = DateTime.ParseExact("29NOV01", "ddMMMyy", CultureInfo.InvariantCulture);

var year = date.Year % 100;

或作为字符串:

var year = date.ToString("yy");

【讨论】:

  • 我的印象是 OP 确实希望它解析为 1 年而不是 2001 年。
  • 我猜这是 OP 想要实现的最终结果,但我愿意打赌 OP 实际上并没有解析罗马晚期的两位数日期。并且假设 OP 想要以 00 结尾的日期使用 0,我的方法将适用于赞成的答案不会。
猜你喜欢
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 2023-03-07
  • 1970-01-01
相关资源
最近更新 更多