3

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

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

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

  • 今天(今天的日期)
  • 现在(今天的日期和时间)
  • 第一个月当前月
  • LastOfCurrentMonth
  • 第一年
  • LastOfCurrentYear

并启用算术:

  • 分钟
  • 小时

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

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

1 回答 1

1

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

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

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

Noda Time是 .Net 中的一个库,支持 ISO8601 持续时间(Period在 Noda Time 中称为 a)。您可以使用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
于 2013-07-11T03:46:50.733 回答