对于您问题的第一部分,没有“现在”、“今天”、“昨天”或“本月第一天”等标记的标准。至少我不知道。
对于第二部分,是的,有一个令牌标准,用于定义离散段中的持续时间。这是 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