4

スケジュールを使用して、アプリケーションで24時間フォーマットの時刻について計算を実行する必要があります。たとえば、17h + 12h=5hです。独自の構造体を作成して、またはTimeをラップアラウンドしようとしました。正常に動作していますが、で実行するフォーマットに行き詰まっています。TimeSpanDateTimeToString

確かに、私はもちろん、私の構造体がどのような文化の下でも機能できるようにしたいと思っています。最初は、フォーマットを構造体に委任し、DateTime厳密に時間に関連しないすべてのカスタムフォーマットをスキップすることを考えていました。TimeSpanたとえば、一部のカルチャで使用されるAM / PMを処理しないため、このタスクをに委任することはできません。たとえば、私のTime構造では次のように書いています。

public string Format(string format, IFormatProvider provider)
{
    return TimeFormat.Format(this, format, DateTimeFormatInfo.GetInstance(provider), provider);
}

// ...

internal class TimeFormat
{
    internal string Format(Time time, string format, DateTimeFormatInfo dtfi, IFormatProvider provider)
    {
        DateTime dt = new DateTime(DateTime.MinValue, 1, 1, time.Hours, time.Minutes, time.Seconds, time.Milliseconds);

        /* Here I am checking what the 'format' string is made of 
        and filter-out anything that is not strictly-time related. */

        return dt.Format(format, provider);
    }
}

ToString構造体のメソッドがDateTimemscorlibにどのように実装されているかを調べました。そして、すごい...考慮すべき非常に多くのもの。そこにあったものを多かれ少なかれ書き直したかったのですが、時間に関連するものだけを残しましたが、これにはすべてが混同されており、理解するのは簡単ではありません。また、ヘブライ語の書式設定など、処理するのが明らかに簡単ではないものがあることに気づきました。これをすべて書き直すと思っていたよりもはるかに時間がかかります。特に自分が何をしているのかをはっきりと理解せずにやりたくない。

要約すると:

  • 時刻の「すべてのカルチャに準拠した」フォーマットを作成するにはどうすればよいですか?
  • 1つ上のレベルで、またはのラッパーを使用して問題を正しく処理していますDateTimeTimeSpan?直接使用することはできませんTimeSpan:負の時間で動作しています(厳密に0から23:59:59.999の間の時間を使用するためにモジュロを使用しています)、一部のカルチャではAM / PMを処理せず、Daysを使用します。私にとって、「時間帯」は「時間帯」とは異なります。
  • カレンダーに依存しないコンテキストであるため、タイムゾーンやDSTを処理する必要はなく、うるう秒も必要ありませんが、時刻のローカライズされたフォーマットを処理できるようにしたいと考えています。(たとえば、「:」の代わりに「H」(またはヘブライ語、中国語、タミル語、ロシア語の文字)を使用するか、24時間形式の代わりにAM / PMを使用します)。

いくつかのライブラリやチュートリアルを紹介するためのヒントやヘルプが役立ちます。

この質問をする前にこの投稿を見て、このライブラリも調べましたが、達成したいことに関しては複雑すぎます。

4

1 に答える 1

4

(これは私自身のプロジェクトのプラグだと思いますが、うまくいけば、人々はそれが完全に関連していることを理解するでしょう:)

いくつかのライブラリやチュートリアルを紹介するためのヒントやヘルプが役立ちます。

私はNodaTimeライブラリのメイン開発者であり、あなたが望むことのほとんどを実行するはずです。初期情報についてはユーザーガイドを参照してください。ここまたはメーリングリストでさらに質問してください。

必要なタイプはですLocalTime

そして、はい、あなたは両方について正しいです、そしてここDateTimeTimeSpanは不適切です、そしてまたフォーマット/構文解析は複雑です:)

Noda Timeでは、通常のBCLタイプと同じようにメソッドを使用でき、現在は静的/ / /メソッドがありますが、今夜はそれらが消える可能性があります:)代わりに、:を使用する必要があります(フォーマットとカルチャごとに)パターンを定義します)、フォーマットと解析の両方に使用します。ToStringParseTryParseParseExactTryParseExactLocalTimePattern

フォーマットと解析に関しては、必要なものについて非常に明確にする必要があります。Noda Timeは、AM / PM指定子が何であるかなどのためにBCLに便乗します。時刻のみを扱っているという事実は、月/日の名前がないため、はるかに簡単になります(および別のカレンダー)心配する。特定のカルチャのt「短い」と「長い」のパターンを使用するか、カスタムパターンを指定できます。Tカスタムパターンは、通常、マシン間の通信に役立ちます。標準のものは、ユーザー指向のフォーマットに役立ちます。

t(現在、およびパターンが存在することを「知っている」必要がTあります。もちろん、ユーザーガイドに文書化されていますが、ある時点で、これを簡単にするメソッドを作成します...)

于 2012-07-22T08:12:14.647 に答える