我希望为Web应用程序添加功能,以使用户能够编写表示日期/时间添加减法的字符串。这需要是服务器端,在.NET中。
示例可能是“Today + 2w
”,“FirstOfCurrentMonth - 1M
”,“Now + 2h
”等。
这将有一些标准变量,例如:
并启用算术:
这显然不是一个很大的项目,但我的问题是:
答案 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