- PR -

DateTimeをシリアル値に変換

投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2004-04-17 20:53
DateTimeに格納されている日時情報をファイルに保存しようと思います。

質問1
C#(NET Framework 1.1)にはある特定の日付を基準にしたシリアル値という
概念は無いのでしょうか?
TimeSpan関数を使って自分で勝手に"2000年1月1日"を基準と定義し、その
経過秒数(あるいは経過ミリ秒数)をシリアル値を定義しても良いのですが、
C#にそのような概念があれば、そちらを採用しようと思います。

質問2
DateTimeが保持している時刻情報の最小単位はミリ秒でしょうか?
(これ以下の単位があっても多分無意味な値でしょうが)
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-04-17 21:02
DateTimeのヘルプを見てみましょう。
以下、いずれもヘルプより
引用:

質問1
C#(NET Framework 1.1)にはある特定の日付を基準にしたシリアル値という
概念は無いのでしょうか?


DateTime.Ticks プロパティ
このインスタンスの日付と時刻を表すタイマ刻み数を取得します。

DateTime コンストラクタ
DateTime 構造体の新しいインスタンスを、指定したタイマ刻み数に初期化します。
引用:

質問2
DateTimeが保持している時刻情報の最小単位はミリ秒でしょうか?


時刻値は 100 ナノ秒単位 (タイマ刻み) で表し、日付は GregorianCalendar 暦の A.D. (西暦紀元) 1 年 1 月 1 日の午前 00:00 からのタイマ刻み数で表します。たとえば、タイマ刻み値 31241376000000000L は、0100 年 1 月 1 日 (金曜日) の深夜 12:00:00 を表します。 DateTime 値は、常に、明示的な暦または既定の暦のコンテキストで表されます。
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2004-04-18 00:43
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2004-04-18 00:49
すみません。なぜか化け文字です。

確かにヘルプには西暦1年1月1日が基準日で最小単位が100ナノ秒と書いて
あります。しかし、西暦1年1月1日を基準日にして100ナノ秒単位の通算ナ
ノ秒数を算出する直接のメソッドが用意されていないように思えます。
したがって、この基準日とナノ秒単位は実用面ではほとんど意味が無いと理解
してOKでしょうか。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-04-18 01:11
引用:

ひろしさんの書き込み (2004-04-18 00:49) より:
確かにヘルプには西暦1年1月1日が基準日で最小単位が100ナノ秒と書いて
あります。しかし、西暦1年1月1日を基準日にして100ナノ秒単位の通算ナ
ノ秒数を算出する直接のメソッドが用意されていないように思えます。


い、いまいち意味が良く分からないんですが、
引用:

したがって、この基準日とナノ秒単位は実用面ではほとんど意味が無いと理解
してOKでしょうか。


まあ、それこそシリアル値としての意味しかないっていうかシリアルに一意な値で表現できるって言う意味があるだけでは(ま、内部表現としての意味はあるにしても)。
※実用的な意味と言うのが良く分かりません…
最初の質問で、シリアル値を使えないのかって仰ってましたから、使える事には意味があるんでは?
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-04-18 09:44
諸農です。

DateTime変数に格納されている情報をファイルに保存したいのであれば、
DateTimeそのものをBinaryFormatterとFileStreamでOKの様な気が。。
日付時刻を文字列形式で保存したいのであれば、ToLongDateString()等の
メソッドで表現形式の変換を行った上で保存してみてはいかがでしょうか。

引用:

DateTimeに格納されている日時情報をファイルに保存しようと思います。


正直言って、このことを行う上で、いったい何が問題になっているのか、
何を問題にしているのか、投稿内容からではわかりません。
とりあえずやってみたい事を試してみて、期待通りの事が出来るのか、
出来ないのかを確認されてみてはいかがですか?


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2004-04-18 20:17
ご返答ありがとうございます。

今回の質問は単に技術的興味が動機でした。「やってみたいことができない」という
わけではありませんでした。実際プログラムでは2000年1月1日からの通算ミリ秒で処
理ができています。ミリ秒でしか取得できないのに100ナノ秒単位で管理している
という部分に少し違和感を感じただけです。

「DateTimeそのものをBinaryFormatterとFileStreamでOK」という方法はしたことが
ありませんでした。
MSDNを見ているのですが、BinaryFormatterによるシリアル化とその復元のし方が
よく分からないのです。アドバイスいただければありがたいです。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-04-18 22:39
諸農です。

MSDNを見られていると言うことですので、
ms-help://MS.MSDNQTR.2004APR.1041/cpref/html/frlrfSystemRuntimeSerializationFormattersBinaryBinaryFormatterClassTopic.htm
上記で示したページに書かれているものが、ズバリだとは思うのですが、
何がよくわからないのでしょうか?

1.サンプルコードの実行方法がわからない?
2.自前での検証コードの書き方がわからない?
3.自前のクラスにシリアライズ属性(Serializable)を付加する方法や
  ISerializableインタフェースの実装方法がわからない?

等々、いろいろと疑問は出てくるのですが。。

コード:

private void button1_Click(object sender, System.EventArgs e)
{
DateTime dt = DateTime.Now;//この日付時刻値は適当に変更してください。
string filename = Path.GetDirectoryName(
Application.ExecutablePath)
+ Path.PathSeparator + "MyData.dat";
BinaryFormatter bf = new BinaryFormatter();
using (FileStream fs = new FileStream(filename,FileMode.Create))
{
bf.Serialize(fs,dt);
}
}

private void button2_Click(object sender, System.EventArgs e)
{
string filename = Path.GetDirectoryName(
Application.ExecutablePath)
+ Path.PathSeparator + "MyData.dat";
BinaryFormatter bf = new BinaryFormatter();
using (FileStream fs = new FileStream(filename,FileMode.Open))
{
DateTime dt = (DateTime)bf.Deserialize(fs);
label1.Text = dt.ToString();
}
}





_________________
諸農和岳
Powered by Borland Delphi/C++Builder & Microsoft VS.NET

[ メッセージ編集済み 編集者: Jubei 編集日時 2004-04-18 22:55 ]

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