3

ユーザーが日付/時刻の加算減算を表す文字列を記述できるようにする機能を Web アプリケーションに追加しようとしています。これはサーバー側で、.NET である必要があります。

例としてはToday + 2w、「 」、「FirstOfCurrentMonth - 1M」、「Now + 2h」などがあります。

これには、次のようないくつかの標準変数があります。

  • 今日(今日の日付)
  • 現在(今日の日時)
  • FirstOfCurrentMonth
  • LastOfCurrentMonth
  • 現在の最初の年
  • LastOfCurrentYear

次の演算を有効にします。

  • 時間
  • 日々
  • 週間

これは明らかに大規模なプロジェクトではありませんが、私の質問は次のとおりです。

  • 少なくとも日付演算部分の標準構文はありますか?
  • これに使用できる .NET (または他のツール) で記述されたツールはありますか?
4

1 に答える 1

1

質問の最初の部分については、「今」、「今日」、「昨日」、「今月の最初」などのトークンの標準はありません。少なくとも私が知っていることはありません。

2 番目の部分については、はい、個別のセグメントで期間を定義するトークンの標準があります。これは、ISO8601 の 2 番目の (見落とされがちな) 部分です。ここでそれについて読むことができます。

たとえば、P3Y6M4DT12H30M5Sは「3 年 6 か月 4 日 12 時間 30 分 5 秒」という期間を表します。

Noda Timeは、ISO8601 期間 ( PeriodNoda 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
于 2013-07-11T03:46:50.733 に答える