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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.86252 の関連記事表示

<< 0 >>
■86252  Re[5]: バイナリデータを読んで、日付などの形にする方法について
□投稿者/ 魔界の仮面弁士 -(2018/01/05(Fri) 16:27:34)
    No86245 (へなちょこ さん) に返信
    > Public Function TimeCal(ByVal getTime As Long) As System.DateTime
    >  Try
    >   Dim Time1 As System.DateTime
    >   Time1 = System.DateTime.FromFileTime(getTime)
    >   Return Time1
    >  Catch exp As ArgumentOutOfRangeException
    >   Throw
    >  End Try
    > End Function

    動作的には間違いというわけではないのですが、
    このコードについて、少しだけ指摘させてください。


    実は今回提示頂いたコードというのは、実質的には下記と同等です。

     Public Function TimeCal(ByVal getTime As Long) As Date
      Return Date.FromFileTime(getTime)
     End Function


    参考にしたコードを真似ただけでしょうから、上記の書き方になるのも致し方ないのですが、
    実際に使う際には、必ずしも例外処理は必要ではありませんし、今回のように
    わざわざ Function 化するほどの必要性も無さそうです。

    ゆえに今回は、Function を作らずとも FromFileTime メソッドを直接呼び出すだけで十分かと思います。

      'x = TimeCal(longValue)
      x = Date.FromFileTime(longValue)



    以下、上記の書き換えについての補足。


    > Public Function TimeCal(ByVal getTime As Long) As System.DateTime

    As Long と As System.Int64 は同じ意味ですし、
    As Date と AS System.DateTime も同じ意味です。

    Integer や Long や Date は、Visual Basic の組み込み型(プリミティブな型)で、
    Int32 や Int64 や DateTime は、.NET Framework で用意された共通言語ランタイムの型名です。

    どちらを使っても良いのですが、引数が前者表記、戻り値が後者表記で
    混在されているのが気にかかりました。

    意図的に使い分けているのであれば良いのですが、もしかしたら
    Date 型の存在をご存じなかったのでは…ということで紹介しておきます。


    左側が .NET Framework で対応するデータ型で、
    右側が Visual Basic が組み込みで持っているデータ型の名前です。
    ここでは右側(組み込み型)のアルファベット順に列挙してみました。

    System.Boolean 構造体  / Boolean 型 (ブール型)
    System.Byte 構造体  / Byte 型 (バイト型)
    System.Char 構造体  / Char 型 (文字型)
    System.DateTime 構造体 / Date 型 (日付型)
    System.Decimal 構造体  / Decimal 型 (10 進型)
    System.Double 構造体  / Double 型 (倍精度浮動小数点数型)
    System.Int32 構造体  / Integer 型 (整数型)
    System.Int64 構造体  / Long 型 (長整数型)
    System.Object クラス  / Object 型 (オブジェクト型)
    System.SByte 構造体  / SByte 型
    System.Int16 構造体  / Short 型
    System.Single 構造体  / Short 型 (単精度浮動小数点型)
    System.String クラス  / String 型 (文字列型)
    System.UInt32 構造体  / UInteger 型
    System.UInt64 構造体  / ULong 型
    System.UInt16 構造体  / UShort 型



    これを踏まえた上で、
    >   Dim Time1 As System.DateTime
    >   Time1 = System.DateTime.FromFileTime(getTime)
    >   Return Time1
    で使われている System.DateTime を Date 表記に書き換えると、
       Dim Time1 As Date
       Time1 = Date.FromFileTime(getTime)
       Return Time1
    のようになります。(ただの別名表記なので、どちらでも結果は一緒です)

    また、必ずしも変換結果を変数に受け取る必要は無いので、上記 3 行を
      Return Date.FromFileTime(getTime)
    と一行にまとめて書くこともできます。コーディングに慣れるまでは
    変数に一度受けておいた方が、処理の流れを追いやすいかも知れませんけれどね。


    >  Catch exp As ArgumentOutOfRangeException
    >   Throw
    >  End Try
    今回使用した FromFileTime メソッドが ArgumentOutOfRangeException の例外を発生させるケースは
     ・引数の値が小さすぎる(getTime が 0 未満だった場合)
     ・引数の値が大きすぎる(getTime が 2650467744000000000 以上の場合)
    に限られます。

    つまり、最小値と最大値は下記の範囲になります。
     Dim 最小値 = Date.FromFileTime(0L)
     Dim 最大値 = Date.FromFileTime(2_650_467_743_999_999_999L)


    この範囲を超えた場合は、例外処理によって Catch 句に入るわけですが、
    先のコードでは、Catch 句で「単に Throw しているだけ」なので、
    実際にはこのような例外処理は、ほとんど意味が無かったりします。
記事No.86240 のレス / END /過去ログ148より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -