40

System.TimeZoneクラスだけでなく、DateTime.ToString()メソッドの多くの用途も認識しています。私が見つけられなかったのは、日時情報に加えて、3 文字のタイム ゾーンの略語を含む文字列に DateTime を変換する方法です (実際、相対時間に対する StackOverflow のツールチップとほぼ同じ方法です)。時間表示は動作します)。

誰もが理解しやすく、利用しやすい例にするために、StackOverflow の例を続けましょう。相対時間で表示されるツールチップを見ると、完全な日付、12 時間形式の秒を含む時間、AM/PM の指定、および 3 文字のタイム ゾーンの略語 (この場合は、Coordinated世界時)。組み込みメソッドを使用して GMT または UTC を簡単に取得できることはわかっていますが、本当に必要なのは、ローカル (この場合は Web サーバー) の時刻です。

私たちの Web サーバーが Windows Server 2k3 を実行していて、タイム ゾーンが CST に設定されている場合 (または、夏時間が元に戻るまでは CDT でしょうか?)、ASP.NET Web アプリでそのタイム ゾーンに相対的な DateTimes を表示したいと考えています。最後に「CST」を表示するようにフォーマットされています。これを簡単にハードコーディングできることはわかっていますが、堅牢性のために、コードの OS 環境設定を実行しているサーバーに基づくソリューションを本当に好んでいます。

現在、次のコードを使用して、タイムゾーンの略語以外はすべて持っています。

myDateTime.ToString("MM/dd/yyyy hh:mm:ss tt")

どちらが表示されますか:

2008/10/07 03:40:31 午後

私が望むのは(そしてそれは大したことではありません、約束します!)それが言うことだけです:

2008 年 10 月 7 日 03:40:31 午後 CDT

System.TimeZone.CurrentTimeZone を使用して「中央夏時間」を正しく表示できますが、簡潔にするために少し長すぎます。空白や大文字以外の文字を削除する文字列操作ルーチンの作成に行き詰まっていますか? それはうまくいくかもしれませんが、それは私には信じられないほどハックのようです...

ここをグーグルで調べても、私の特定の質問に当てはまるものは何もありませんでした。

4

8 に答える 8

5

自由に利用できるライブラリTZ4NETがあり、これらの略語を利用できます。.NET 3.5 より前のバージョンでは、これはタイムゾーン間で変換するための唯一の代替手段の 1 つでもありました。

別のライブラリが必要ない場合は、TimeZoneInfo クラスを使用して合理的な略語のマップを生成し、それらをユーザーに提供するだけで済みます。

于 2008-10-08T03:42:00.280 に答える
1

タイム ゾーン名をその略語に変換するルックアップ テーブルを作成します。一致するものが見つからない場合は、完全なゾーン名を返すことができます。

タイムゾーンの略語を参照してください。

于 2008-10-08T02:20:07.433 に答える
1

DaylightName/StandardName から略語を取得する場合、文字列は不変であるため、StringBuilder を使用して文字列を作成する方がよいでしょう。

    public static string ToCurrentTimeZoneString(this DateTime date)
    {
        string name = TimeZone.CurrentTimeZone.IsDaylightSavingTime(date) ?
            TimeZone.CurrentTimeZone.DaylightName :
            TimeZone.CurrentTimeZone.StandardName;
        return name;
    }

    public static string ToCurrentTimeZoneShortString(this DateTime date)
    {
        StringBuilder result = new StringBuilder();

        foreach (string value in date.ToCurrentTimeZoneString().Split(' '))
        {
            if (value.IsNotNullOrEmptyWithTrim())
            {
                result.Append(char.ToUpper(value[0]));
            }
        }

        return result.ToString();
    }

もちろん、KeyValuePair を含む配列は、おそらく多国籍企業に最適です。厳しい締め切りを数分短縮したい場合、そしてあなたが米国の会社にいる場合、これはうまくいきます.

于 2011-09-29T17:14:15.383 に答える
0

必要な堅牢性のレベルによって異なります。

いずれにせよ、おそらく何らかのハックが必要になるでしょう。簡単な方法は、文字列をスペースで分割し、各単語の最初の文字を連結することです。すなわち

string[] words = tzname.Split(" ".ToCharArray());
string tzabbr = "";
foreach (string word in words)
   tzabbr += word[0];

これは、地球上のすべてのタイム ゾーンで機能するわけではありませんが、ほとんどのタイム ゾーンで機能します。より堅牢にする必要がある場合は、おそらくタイム ゾーン名をその略語にマップするマップを作成する必要があります。

于 2008-10-07T21:40:34.940 に答える
-1

わかりました、それから 4 年 (そしてほぼ 1 週間) が経ちました。LINQ を議論に持ち込む時が来ました...

Criag と Bob のアイデアをまとめると...

public static String TimeZoneName2(DateTime dt)
{
    var return ToCurrentTimeZoneShortString(dt)
                 .Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries);
    return sSplit.Aggregate("", (st,w)=> st +=w[0]);
}

TimeZone が 2 つの連続したスペースを含む文字列を返さないと信頼できない場合を除きます。

public static String TimeZoneName3(DateTime dt)
{
    return ToCurrentTimeZoneShortString(dt).Split(' ')
                 .Aggregate("", (st,w)=> st +=w[0]);
}
于 2012-10-12T14:03:22.247 に答える
-1

<= .Net 3.0 を使用している場合は、TZ4Net をダウンロードして OlsonTimeZone.CurrentTimeZone.StandardAbbreviation を使用します。 > .Net 3.0 では NodaTime またはその他を使用します。タイムゾーン名は、頭字語から略語を作成するために単純な文字列操作に依存できる規則には準拠していません。間違っている 5% の確率でまだ間違っています。

于 2014-10-27T03:06:33.000 に答える