0

我有一个 asp.net 应用程序,其中有以下三个日期:

现在=08-10-13 15:56:19

cloture1 =01-10-13 00:00:00

cloture2=01-01-50 00:00:00

日期的格式是DD-MM-YY HH:MM:SS. 问题是该函数DateTime.Compare()给了我相同的结果,即

DateTime.Compare(now,cloture1) > 0DateTime.Compare(now,cloture2) > 0

那么这个问题的原因是什么呢?我怎样才能修复我的片段?

4

3 回答 3

6

问题是您的程序很可能将 cloture2 解释为 1950,而不是 2050。因为您没有发布设置 cloture2 的代码,所以我无法提供具体的解决方案,但我能提供的最好的解决方案是您使用 01-10-2050在您的代码中明确显示。

于 2013-10-08T14:12:23.430 回答
1

如果now晚于cloture1则返回值将是 1(或大于零)。

您与示例日期一起提供的代码在参考 MSDN 文章中似乎可以正常工作DateTime.Compare

DateTime.Compare有关该方法的更多信息,请查看以下链接:

http://msdn.microsoft.com/en-us/library/system.datetime.compare.aspx

如果您认为您的代码仍然不正确,请详细说明您的问题。

于 2013-10-08T14:13:42.110 回答
1

The "yy" Custom Format Specifier

在解析操作中,使用“yy”自定义格式说明符解析的两位数年份将根据 Calendar.TwoDigitYearMax格式提供者当前日历的属性进行解释。

在解析操作中,使用“yy”自定义格式说明符解析的两位数年份基于格式提供程序当前日历的 Calendar.TwoDigitYearMax 属性进行解释。下面的示例使用 en-US 区域性的默认公历分析具有两位数年份的日期的字符串表示形式。

GregorianCalendar.TwoDigitYearMax

此属性允许将 2 位数年份正确转换为 4 位数年份。例如,如果将此属性设置为 2029,则 100 年的范围是从 1930 到 2029。因此,两位数的值 30 被解释为 1930,而两位数的值 29 被解释为 2029。

您的应用程序应将此值设置为 99,以指示按字面意思获取 2 位数年份。例如,如果此属性设置为 99,则 100 年范围是从 0(对于大多数日历而言不是有效值)到 99。因此,2 位值 30 被解释为 30。

即使你反编译GregorianCalendar.TwoDigitYearMax属性,你也可以看到自己;

public override int TwoDigitYearMax
{
  get
  {
    if (this.twoDigitYearMax == -1)
      this.twoDigitYearMax = Calendar.GetSystemTwoDigitYearSetting(this.ID, 2029);
    return this.twoDigitYearMax;
  }

Boluc's answer完全正确。我还想指出您的格式部分。

您不能使用格式格式化两位数年份YYYY。您需要使用yy允许两位数格式的格式。

DateTime dt = DateTime.ParseExact("01-01-50 00:00:00", "dd-MM-yy HH:mm:ss", CultureInfo.InvariantCulture);

印刷

01.01.1950 00:00:00

这里一个DEMO.

查看更多信息Custom Date and Time Format Strings

于 2013-10-08T14:18:54.817 回答