C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: DateTimeフォーマット


(過去ログ 44 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■23244 / inTopicNo.1)  DateTimeフォーマット
  
□投稿者/ asuka (49回)-(2008/08/11(Mon) 21:10:26)

分類:[C#] 

お世話になっております。asukaです。

IISのログ(System32/LogFiles/...)のログ時刻がGMT(世界標準時刻)なので、9時間足してJST(日本標準時刻)にしたと考えております。

コメント部分は#から始まるのですっとばせるとしまして、

その他のログ部は先頭から19文字が時刻であることまで分かっております。
⇒[yyyy-MM-dd HH:mm:ss]



ファイルから1行読込んだバッファの先頭から19文字をstring型で取得して、DateTime型の変数に渡しております。
DateTime dtGMT = Convert.ToDateTime( strReadBuf.Substring(0,19) );

次に9時間足した日時を取得しております。
DateTime dtJST = dtGMT.AddHours(9);



ここからが問題なのですが、元あるGMTで記載されたバッファの日時をstring.Replace()で9時間足した文字に置き換えたいと思っているのですが、

dtJSTの値が[yyyy/mm/dd (h)h:mm:ss]と、メッセージボックスで見てみると時刻部分が1桁で表示されることがあります。

[yyyy-mm-dd hh:mm:ss]形式で[/]を[-]、年以外を0埋めの2桁で表示したいのですが、

DateTime.ParseExactでは決められたフォーマット([/]を[-]とか無理でした)でしか対応していないみたいなのですが、

何か良い方法はありますでしょうか?




現状はC++でやっていたように、年、月、日、時、分、秒の変数を宣言して、

年以外の変数の先頭に0を付けてから、後ろから2桁取得して文字列結合しようと思ってますが、

良い手があるようでしたら教えて頂けれると幸いです。








引用返信 編集キー/
■23247 / inTopicNo.2)  Re[1]: DateTimeフォーマット
□投稿者/ 魔界の仮面弁士 (805回)-(2008/08/11(Mon) 21:50:54)
2008/08/11(Mon) 21:55:35 編集(投稿者)

No23244 (asuka さん) に返信
> IISのログ(System32/LogFiles/...)のログ時刻がGMT(世界標準時刻)なので、
> 9時間足してJST(日本標準時刻)にしたと考えております。
Microsoft Log Parser で、
 string query = @"SELECT TO_LOCALTIME(TO_TIMESTAMP(date,time)) as JSTDate, 〜 FROM 〜";
 LogRecordSet oRecordSet = oLogQuery.Execute(query, oEVTInputFormat);
のようなクエリを投げるのが手っ取り早いかも。

> その他のログ部は先頭から19文字が時刻であることまで分かっております。
ログ内の位置は、IIS のログ設定次第で変わりますよ。

> dtJSTの値が[yyyy/mm/dd (h)h:mm:ss]と、メッセージボックスで見てみると時刻部分が1桁で表示されることがあります。
日付型の dtJST をメッセージボックスに表示させるために、どのようなコードを書いているのでしょうか?

> [yyyy-mm-dd hh:mm:ss]形式で[/]を[-]、年以外を0埋めの2桁で表示したいのですが、
string.Format や、DateTime.ToString で書式指定すれば、表示対応できるかと思います。たとえば、
 string stJST = dtJST.ToString("yyyy-MM-dd hh:mm:ss");
とか、あるいはカルチャも指定して
 //using System.Globalization;
 string stJST = dtJST.ToString("yyyy-MM-dd hh:mm:ss", CultureInfo.InvariantCulture);
とか。
引用返信 編集キー/
■23328 / inTopicNo.3)  Re[2]: DateTimeフォーマット
□投稿者/ asuka (50回)-(2008/08/12(Tue) 19:58:15)
■魔界の仮面弁士さん
返信ありがとうございます。

>>IISのログ(System32/LogFiles/...)のログ時刻がGMT(世界標準時刻)なので、
>>9時間足してJST(日本標準時刻)にしたと考えております。
> Microsoft Log Parser で、
>  string query = @"SELECT TO_LOCALTIME(TO_TIMESTAMP(date,time)) as JSTDate, 〜 FROM 〜";
>  LogRecordSet oRecordSet = oLogQuery.Execute(query, oEVTInputFormat);
> のようなクエリを投げるのが手っ取り早いかも。

凄いですね、、、
このような手法は知りませんでした。
確かにこちらの方がよさそうですが、何かしらのDBにテーブルを作ってログを格納する必要があるのでしょうか?



>>その他のログ部は先頭から19文字が時刻であることまで分かっております。
> ログ内の位置は、IIS のログ設定次第で変わりますよ。

頂いたコメントを見てかなり泣けました・・・
僕がやっていたのはW3Cオンリーで、しかも日付と時間を出していないと使えないようです。
下調べが足りませんでした。><



>>dtJSTの値が[yyyy/mm/dd (h)h:mm:ss]と、メッセージボックスで見てみると時刻部分が1桁で表示されることがあります。
> 日付型の dtJST をメッセージボックスに表示させるために、どのようなコードを書いているのでしょうか?

MessageBox.Show(dtJST);
としているだけなのですが、稀にhhがhで表記されているのを見つけてしまいました。



>>[yyyy-mm-dd hh:mm:ss]形式で[/]を[-]、年以外を0埋めの2桁で表示したいのですが、
> string.Format や、DateTime.ToString で書式指定すれば、表示対応できるかと思います。たとえば、
>  string stJST = dtJST.ToString("yyyy-MM-dd hh:mm:ss");
> とか、あるいはカルチャも指定して
>  //using System.Globalization;
>  string stJST = dtJST.ToString("yyyy-MM-dd hh:mm:ss", CultureInfo.InvariantCulture);
> とか。

出来ました・・・
今回は仕様もかなり限定ですが、助かりました。
本当にありがとうございました。

解決済み
引用返信 編集キー/
■23330 / inTopicNo.4)  Re[3]: DateTimeフォーマット
□投稿者/ 魔界の仮面弁士 (809回)-(2008/08/12(Tue) 20:38:51)
2008/08/12(Tue) 22:51:47 編集(投稿者)

No23328 (asuka さん) に返信
>>Microsoft Log Parser で、
>> string query = @"SELECT TO_LOCALTIME(TO_TIMESTAMP(date,time)) as JSTDate, 〜 FROM 〜";
>> LogRecordSet oRecordSet = oLogQuery.Execute(query, oEVTInputFormat);
>>のようなクエリを投げるのが手っ取り早いかも。
> このような手法は知りませんでした。
> 確かにこちらの方がよさそうですが、何かしらのDBにテーブルを作ってログを格納する必要があるのでしょうか?

DB 等は不要です。任意のログ(独自形式でも可)を、クエリで問い合わせる事ができるのが
「Log Parser」です。(そのヘルプには、簡易ながら C# からの利用例も記載されています)

COM オブジェクト経由で操作する事も、コマンドラインから実行する事もできます。
出力結果は、CSV や XML への変換、グラフ化、画面(ListView)表示などをサポートしています。


[Log Parser 2.2 日本語版]
http://www.microsoft.com/japan/technet/scriptcenter/tools/logparser/default.mspx

[Log Parserを活用する]
http://www.atmarkit.co.jp/fwin2k/operation/logparser1/logparser1_01.html
http://www.atmarkit.co.jp/fwin2k/operation/logparser2/logparser2_01.html

[eXConn Log Parser フォーラム]
http://www.exconn.net/Forums/ShowForum.aspx?ForumID=60


> 僕がやっていたのはW3Cオンリーで、しかも日付と時間を出していないと使えないようです。
ログの途中から、出力される列が変更される事もありますね。
まともに解析しようとすると意外と面倒なので、LogParser を使った方が楽だとは思いますが、
限定された条件下においては、今回の asuka さんの対処方法でも十分かも。


> MessageBox.Show(dtJST);
> としているだけなのですが、稀にhhがhで表記されているのを見つけてしまいました。
あれ? C# なのですよね? VB や JScript ではなく。

MessageBox.Show に、DateTime 型(あるいはobject 型)を受け取るオーバーロードは無いので、
 DateTime dt = new DateTime(2008, 1, 2, 3, 4, 5, DateTimeKind.Local);
 MessageBox.Show(dt); //★
などと書いたら、おそらく、CS1502 か CS1503 あたりのコンパイル エラーになるはずですが……。

もしこれが VB であれば、「MessageBox.Show(dt)」の構文でも通りえるのですが、
その場合の結果は、「MessageBox.Show(dt.ToString())」の実行結果と同じになります。

そしてこの場合の日付書式は、コントロールパネルの『地域と言語のオプション』設定に依存します。
この設定画面から、時刻のカスタマイズ形式を確認して、それが "H:mm:ss" になっていれば、
0〜9時台は 1 桁で表示されますが、"HH:mm:ss" になっていれば、常に 2 桁で表示される事になります。


>> string stJST = dtJST.ToString("yyyy-MM-dd hh:mm:ss", CultureInfo.InvariantCulture);
> 出来ました・・・
すみません。この部分を書き間違えていました。
 string stJST = dtJST.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
に変更してください。hh は 12 時間表記、HH は 24時間表記になります。


>>>> DateTime dtGMT = Convert.ToDateTime( strReadBuf.Substring(0,19) );
>>>> DateTime dtJST = dtGMT.AddHours(9);
現地時間として取得したいのであれば、
 string s = "2008/08/12 01:23:45";
 DateTime dt = Convert.ToDateTime(s + " GMT");
だけで済ますこともできます。

こうすると、現地時間(つまり、JST)にて「グリニッジ標準時での1時23分」が取り込まれるので、
AddHours することなく、10時23分という値を得る事ができます。


ただし、Convert.ToDateTime や DateTime.Parse は非効率的なので、できれば
DateTime.ParseExact を使った「日付書式を明示指定しての変換」にした方が良いでしょう。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -