是否有日期/时间加/减和变量的标准语法?

时间:2013-07-10 21:12:32

标签: .net parsing datetime date-format

我希望为Web应用程序添加功能,以使用户能够编写表示日期/时间添加减法的字符串。这需要是服务器端,在.NET中。

示例可能是“Today + 2w”,“FirstOfCurrentMonth - 1M”,“Now + 2h”等。

这将有一些标准变量,例如:

  • 今天(今天的日期)
  • 现在(今天的日期和时间)
  • FirstOfCurrentMonth
  • LastOfCurrentMonth
  • FirstOfCurrentYear
  • LastOfCurrentYear

并启用算术:

  • 分钟
  • 小时
  • 个月

这显然不是一个很大的项目,但我的问题是:

  • 是否有任何标准语法,至少对于日期算术部分?
  • 是否有用.NET(或其他)编写的可用于此的工具?

1 个答案:

答案 0 :(得分:1)

对于你问题的第一部分,没有像“现在”,“今天”,“昨天”或“当月第一”等标记的标准,等等。至少不是我知道的的。

对于第二部分,,有一个标记用于定义离散段中的持续时间。这是ISO8601的第二个(经常被忽视的)部分。你可以阅读它here

例如,P3Y6M4DT12H30M5S表示“三年,六个月,四天,十二小时,三十五分钟和五秒钟”的持续时间。

Noda Time是.Net中的一个库,它支持ISO8601持续时间(在Noda Time中称为Period)。您可以使用NodaTime.Text.PeriodPattern来处理它们。

野田时间也可能是其余问题的良好基础。文本部分是可扩展的,因此您可以编写自定义模式格式化程序和解析器以使用您自己的标记。

只是为了让您了解这可能如何工作,请考虑以下示例:

var pattern = PeriodPattern.NormalizingIsoPattern;
var result = pattern.Parse("P3Y6M4DT12H30M5S");
if (!result.Success) return;  // or throw, or whatever

var period = result.Value;
Debug.WriteLine("Years: {0}", period.Years);
Debug.WriteLine("Months: {0}", period.Months);
Debug.WriteLine("Days: {0}", period.Days);
Debug.WriteLine("Hours: {0}", period.Hours);
Debug.WriteLine("Minutes: {0}", period.Minutes);
Debug.WriteLine("Seconds: {0}", period.Seconds);

var now = SystemClock.Instance.Now;
var zone = DateTimeZoneProviders.Tzdb["America/New_York"];
var localNow = now.InZone(zone).LocalDateTime;
var output = localNow + period;

Debug.WriteLine(localNow);
Debug.WriteLine(output);

输出:

Years: 3
Months: 6
Days: 4
Hours: 12
Minutes: 30
Seconds: 5
7/11/2013 12:03:58 AM
1/15/2017 12:34:03 PM