- 題名: VBでのファイル送受信について2
- 日時: 2010/02/19 12:49:08
- ID: 26425
- この記事の返信元:
- (なし)
- この記事への返信:
- [26428] Re[1]: VBでのファイル送受信について22010/02/19 14:02:50
- ツリーを表示
■No26425に返信(リモーネさんの記事) > 「?年?月?日 ?時?分付けでサーバーに登録されました」 > といったように送信日時のメッセージ表示をしたいと考えています。 具体的には、上記はどの時刻を指しているのでしょうか? ・送信を開始した時点での FTP クライアント側の時刻 ・送信を開始した時点での FTP サーバー側の時刻 ・送信が終了した時点での FTP クライアント側の時刻 ・送信が終了した時点での FTP サーバー側の時刻 ・FTP サーバー上に保存されたファイルの、ファイルシステム上の作成日時 ・FTP サーバー上に保存されたファイルの、ファイルシステム上の更新日時 ・その他 > まずそもそも今回私がやりたい事(送信日時のメッセージ表示)を行う上で > この方法は妥当(一般的?)でしょうか? 上記いずれを求めているかによって異なると思います。 > 現在(送信後)の時間が 2010/02/19 12:22 だとして > 取得した日時が9時間後の "2010/02/19 21:22:38" となるのですが 日本の時差は +9時間ですよね。 > この現象について何か助言頂けないでしょうか? GMT とか UTC とか JST とか。 > サーバ日付がおかしい? Sub Main() Dim dt0 As Date = #02/19/2010 12:22:38# Dim dt1 As New Date(2010, 2, 19, 21, 22, 38, 0, DateTimeKind.Local) Dim dt2 As New Date(2010, 2, 19, 12, 22, 38, 0, DateTimeKind.Utc) Console.WriteLine("元データ") 'Kind プロパティの違いに注意 Console.WriteLine("dt0 => " & dt0.ToString("yyyy/MM/dd HH:mm:ss.fffffff K")) Console.WriteLine("dt1 => " & dt1.ToString("yyyy/MM/dd HH:mm:ss.fffffff K")) Console.WriteLine("dt2 => " & dt2.ToString("yyyy/MM/dd HH:mm:ss.fffffff K")) Console.WriteLine("UTC(世界協定時刻)") 'いずれも、12時22分になるはず Console.WriteLine("dt0 => " & ToStringByUTC(dt0)) Console.WriteLine("dt1 => " & ToStringByUTC(dt1)) Console.WriteLine("dt2 => " & ToStringByUTC(dt2)) Console.WriteLine("現地時刻") '日本なら、21時22分になるはず Console.WriteLine("dt0 => " & ToStringByLocal(dt0)) Console.WriteLine("dt1 => " & ToStringByLocal(dt1)) Console.WriteLine("dt2 => " & ToStringByLocal(dt2)) End Sub Public Function ToStringByUTC(ByVal d As Date) As String If d.Kind = DateTimeKind.Unspecified Then Return d.ToString("yyyy/MM/dd HH:mm:ss.fffffff") Else Return d.ToUniversalTime().ToString("yyyy/MM/dd HH:mm:ss.fffffff") End If End Function Public Function ToStringByLocal(ByVal d As Date) As String If d.Kind = DateTimeKind.Local Then Return d.ToString("yyyy/MM/dd HH:mm:ss.fffffff") Else Return d.ToLocalTime().ToString("yyyy/MM/dd HH:mm:ss.fffffff") End If End Function
■No26429に返信(リモーネさんの記事) > といった意味合いで表示したいと思っていますので >> ・送信が終了した時点での FTP サーバー側の時刻 > になると思います。 現状は、GetDateTimestamp(MDTM) で LastModified を得ているのでしょうか。 その場合は、 ・FTP サーバー上に保存されたファイルの、ファイルシステム上の更新日時 に相当するかと思います。それで構わないのであれば、今の方向性で OK かと。 >> 上記いずれを求めているかによって異なると思います。 > 以上を踏まえて、申し訳ありませんが再度助言頂けないでしょうか? 一部のメソッドしかサポートしていない FTP サーバーも存在するため、 サーバー側の時刻を確実に得る方法は無いかも知れません。 先の MDTM にしても、たとえサーバーがサポートしていたとしても、その結果が 標準時で返されるサーバーもあれば、localtime で返してくるサーバーも存在しますので、 どうすべきかはケースバイケースです。 まぁ、通信相手のサーバーが固定的な場合は、事前に調査しておけば済みますけれどね。 (たとえば FFFTP などでは、ホストのタイムゾーンを設定できるようになっています) >>GMT とか UTC とか JST とか。 > あーなるほど、こうゆう事も意識しないと… ちなみに .NET 3.5 には、DateTime 型に『時差情報』を含ませた DataTimeOffset 型が用意されています。今回は関係無いですけれども。 > という事は…ToStringByUTC(ftpRes.LastModified)になる…? すみません。本来は下記のコードを掲載する予定でした。 先ほどのコードと差し替えて、結果の違いを確認してみてください。 Public Function ToStringByUTC(ByVal d As Date) As String If d.Kind = DateTimeKind.Utc Then Return d.ToString("yyyy/MM/dd HH:mm:ss.fffffff") Else Return d.ToUniversalTime().ToString("yyyy/MM/dd HH:mm:ss.fffffff") End If End Function dt1 と dt2 は同じ時刻ですが、タイムゾーンが異なります。 dt1 は、21:22:38 +09:00 (現地時間21時22分)で、 dt2 は、12:22:38 +00:00 (標準時 12時22分)です。 この場合の変換結果は dt1 は、標準時 で 12:22、現地時間で 21:22 dt2 も、標準時 で 12:22、現地時間で 21:22 になると思います。(この点だけ見れば、元のソースでも同じ動きです) 問題は dt0 です。 これは Unspecified すなわち「日本時間か標準時か不明な状態」なので、 補正不要なのか、+09:00 すべきなのか、-09:00 すべきなのかは定めようが無く、 それぞれのアプリごとに、ケースバイケースで判断していただく必要があります。 (多くの場合、日付型の Kind プロパティは Unspecified の状態です)
分類:[.NET]
以前↓もお世話になりましたが、よろしくお願いします。
http://dobon.net/vb/bbs/log3-41/25238.html
【解決したい問題】
以前、こちらの.NET Tipsおよび掲示板にお世話になり、Windowsアプリから
FTPサーバーにファイルをアップロード/ダウンロードする機能を作成しました。
・実行Buttonクリック
・送信ファイル作成
・FTPアップロード
・MessageBox.Show("ファイルの作成・送信が完了しました")
簡単ですが、以上のようなイメージです。
今回、別システムで似た機能を作成しているのですが、
上記イメージで言うと最後のMessageBoxの表示内容を
「?年?月?日 ?時?分付けでサーバーに登録されました」
といったように送信日時のメッセージ表示をしたいと考えています。
【解決するために何をしたか】
上記イメージで言うと、FTPアップロードの直後に連続処理で
FtpWebRequest等のオブジェクトをもう一つ用意して、こちらの.NET Tips
「FTPサーバーのファイルのファイルの更新日時を取得する」を参考に
アップロードした直後のファイルを指定して情報を得ようと考えました。
ここから質問ですが
1
まずそもそも今回私がやりたい事(送信日時のメッセージ表示)を行う上で
この方法は妥当(一般的?)でしょうか?
# そんな事しなくてもこうすれば…みたいな事があれば助言頂ければと。
2
とりあえず今はこの方法でテストしていますが、ftpRes.LastModifiedの時間が
現在(送信後)の時間が 2010/02/19 12:22 だとして
取得した日時が9時間後の "2010/02/19 21:22:38" となるのですが
この現象について何か助言頂けないでしょうか?(サーバ日付がおかしい?)
因みに、ftpRes.StatusDescriptionは、"FileStatus: 213 20100219122238"となります。
今回も乱文・長文ですが、よろしくお願いします。