質問の最初の部分については、「今」、「今日」、「昨日」、「今月の最初」などのトークンの標準はありません。少なくとも私が知っていることはありません。
2 番目の部分については、はい、個別のセグメントで期間を定義するトークンの標準があります。これは、ISO8601 の 2 番目の (見落とされがちな) 部分です。ここでそれについて読むことができます。
たとえば、P3Y6M4DT12H30M5S
は「3 年 6 か月 4 日 12 時間 30 分 5 秒」という期間を表します。
Noda Timeは、ISO8601 期間 ( Period
Noda Time では a と呼ばれる) をサポートする .Net のライブラリの 1 つです。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