- PR -

アプリ内で使用する日時フォーマットをOSに依存しない方法

投稿者投稿内容
まる
会議室デビュー日: 2008/10/20
投稿数: 4
投稿日時: 2008-10-20 11:20
初めて投稿させていただきます。


■開発環境
Visual Studio 2005(C#)


■目的
あるアプリケーションにおいて、OSの設定に依存することなく「yyyy/MM/dd H:mm:ss(=2008/10/20 14:58:12)」の日時フォーマットを使用したいと考えています。
これはDateTime.Nowの実行時に、OSの設定により「2008年10月20日水曜日 午後2時58分」や「2008-10-20 14:58:12」等、フォーマットが異なってしまうことを避けたいためです。


アプリケーション起動の処理部分に以下のコードを埋めております。

[STAThread]
public static void Main()
{
// -- ↓↓ ここから ↓↓ ------------------------------------------------
// アプリ内で使用する日時フォーマットを「yyyy/MM/dd H:mm:ss」に設定する
System.Globalization.DateTimeFormatInfo dateInfo =
new System.Globalization.DateTimeFormatInfo();

dateInfo.ShortDatePattern = "yyyy/MM/dd";
dateInfo.ShortTimePattern = "H:mm:ss";
dateInfo.LongTimePattern = "H:mm:ss";
dateInfo.DateSeparator = "/";
dateInfo.AMDesignator = "";
dateInfo.PMDesignator = "";

System.Globalization.CultureInfo cultureInfo =
new System.Globalization.CultureInfo("ja-JP");
cultureInfo.DateTimeFormat = dateInfo;

Application.CurrentCulture = cultureInfo;
// -- ↑↑ ここまで ↑↑ ------------------------------------------------


〜〜 途中省略 〜〜

    Application.Run(メイン画面);
}


日時の表示を「2008年10月20日水曜日 午後2時58分」の表示に変更し、実行させた結果
アプリケーション内での日付は「2008/10/20 14:58:12」と表示されておりました。


一応動作はしたものの、コードが正しいのかどうかの判断が出来ず、投稿させていただきました。
ご存知の方、いらっしゃいましたらご教授願えないでしょうか。


よろしくお願い致します。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-10-20 16:35
ごく単純に

DateTime now = DateTime.Now;
string s = now.ToString(書式文字列);

じゃだめなんですか?
まる
会議室デビュー日: 2008/10/20
投稿数: 4
投稿日時: 2008-10-20 18:10
渋木様

ご回答ありがとうございます。

申し訳ありません、私の説明が不足していました。

アプリケーション内で日時フォーマットを統一したいと考えたのは、サーバの日時設定とクライアントの日時設定が異なる場合に日時の変換でエラーが発生してしまったことに起因しています。

例えば、以下のようなコードを実行します。

■クライアント側
 //サーバ日時を取得し、文字列で返却
 string now = GetSysdate();

■サーバ側
 public string GetSysdate()
 {
//サーバ側の日時設定は「yyyy/MM/dd H:mm:ss」
return DateTime.Now.ToString();
 }

これを実行しますと変数nowの値が"2008/10/20 14:58:12"となり、
日時の表示を「2008 10月20日水曜日 午後2時58分」と設定しているクライアントのPC上で

 DateTime.Parse(now);

を実行するとIndexOutOfRangeExceptionが発生してしまうんです。
実際、このような設定をしていたユーザさんがいらっしゃいまして。。

クライアントPCの日時の設定を変更することで、ひとまずIndexOutOfRangeExceptionは発生しなくなりましたが、

 1.日時フォーマットの違いを考慮しておらず、修正箇所が多いこと
 2.使用するクライアントPCが不特定多数であること
 3.クライアントPCの設定を極力変更したくないこと

上記3つの理由から、アプリケーション内で日時フォーマットを統一したいと考えました。
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2008-10-20 20:27
方法はいくつかあると思いますが
・サーバ側でフォーマットしない
が一番問題がないと思います。

2箇所以上で処理されるデータを扱うときは
送信されるデータは環境に依存しない形で
やり取りするべきでしょう。

サーバクライアント間で時刻は
秒やミリ秒の形に変換された状態で送信するべきでしょう
まる
会議室デビュー日: 2008/10/20
投稿数: 4
投稿日時: 2008-10-21 16:31
あすか様

ご回答ありがとうございます。

「サーバ側でフォーマットしない 」
というのは、string型ではなくDateTime型でサーバクライアント間でやりとりを行えばよい、という認識でよろしいでしょうか?

本来であれば、それが一番ベストであるとは思っているのですが
修正箇所が多いことや、あまり工数をかけられないこともありまして
アプリケーション内での日時フォーマットを統一するのが一番手っ取り早いのかなと。

はじめに記述しましたコードでは危険でしょうか。。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2008-10-21 18:52
「フォーマットしない」の意味は、

>DateTime型でサーバクライアント間でやりとりを行えばよい
ではなく

>秒やミリ秒の形に変換された状態で送信
のことですね。

固定フォーマットでも良いと思いますが、いずれにしても確実に同じことを意味する文字列にする必要がある、ということで。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-10-22 12:51
念のため情報共有のリンクです。

2008-10-21 20:15 に投稿された別の掲示板のスレッドです。
http://vsug.jp/tabid/63/forumid/45/threadid/11383/scope/posts/Default.aspx

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2008-10-22 13:15
引用:

はじめに記述しましたコードでは危険でしょうか。。


その点のみを考察するのであれば問題はないです。


動作環境にいっさい依存しない形で日時を表示したい
という考え方は
決して珍しいものではないですね。


個人的な好みでいうなら
この処理はユーティリティ化したくなります。

スキルアップ/キャリアアップ(JOB@IT)