none
関数内でパラメータを使って[DateTime]::ParseExactを呼び出すと例外が発生する RRS feed

  • 質問

  • PowerShell 初心者です。

    日付を[[yy]yy]MMDDhhmm[.ss] で入力し、日付データ型に変換しようとしています。

    04150101 だと、2017/04/15 01:01:00

    1603202105.35 だと、2016/03/20 21:05:35

    196311221230 だと、1963/11/22 12:30:00

    になるようにしたいと思い、変換部分を関数化したです。

    とりあえず、テストとして、日付文字列とフォーマットを渡して関数内で変換するスクリプトを作ってみたのですが、

    パラメータで日付、フォーマットを指定すると例外になってしまいます。

    関数内で直値で指定すると例外は発生しません。原因が分からず困っています。何かヒントをいただけないでしょうか?

    -----------------------

    Function Str2Date([string]$pstrDate, [string]$pstrFormat)
    {
        $private:result = $null
    #    try
    #    {
    #        $private:result = [DateTime]::ParseExact("20171211", "yyyyMMdd", $null)
            $private:result = [DateTime]::ParseExact($pstrDate, $pstrFormat, $null)
    #    }
    #    catch
    #    {
    #        Write-Host 'Date Format Error!!'
    #        exit
    #    }
        return $private:result
    }

    $DateParam = Str2Date('20171211', 'yyyyMMdd')
    -----------------------

    実行環境

    Name                           Value
    ----                           -----
    PSVersion                      5.1.15063.138
    PSEdition                      Desktop
    PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
    BuildVersion                   10.0.15063.138
    CLRVersion                     4.0.30319.42000
    WSManStackVersion              3.0
    PSRemotingProtocolVersion      2.3
    SerializationVersion           1.1.0.1

    2017年4月15日 16:16

回答

  • > $DateParam = Str2Date('20171211', 'yyyyMMdd')

    関数の呼び出しを

    $DateParam = Str2Date 20171211 yyyyMMdd

    に変更してみてください。

    元の呼び出し方ですと、$pstrDate に「20171211 yyyyMMdd」、$pstrFormat に「」が渡されます。

    これは『('20171211', 'yyyyMMdd')』が、2 つの String 値を持つ Object 配列として認識されるためです。

    2017年4月15日 19:19

すべての返信

  • ミoωoミ さま よろしく。

    日付型の初期値は 0001/01/01 0:00:00 ( '0001/1/1 0:0:0' ) だった気がしますが?。  最初に $null をセットしているのを変えてみては如何でしょうか?。

    違っていたら、ごめんなさい。
    • 編集済み ShiroYuki_Mot 2017年4月15日 17:08 自信ないので
    2017年4月15日 17:00
  • > $DateParam = Str2Date('20171211', 'yyyyMMdd')

    関数の呼び出しを

    $DateParam = Str2Date 20171211 yyyyMMdd

    に変更してみてください。

    元の呼び出し方ですと、$pstrDate に「20171211 yyyyMMdd」、$pstrFormat に「」が渡されます。

    これは『('20171211', 'yyyyMMdd')』が、2 つの String 値を持つ Object 配列として認識されるためです。

    2017年4月15日 19:19
  • > 日付を[[yy]yy]MMDDhhmm[.ss] で入力し、日付データ型に変換しようとしています。

    書式文字列の大文字小文字に注意:

    Function ToDate([String]$pstrDate) {
        [String[]]$formats = @(
                'MMddHHmm',     'MMddHHmm.ss',
              'yyMMddHHmm',   'yyMMddHHmm.ss',
            'yyyyMMddHHmm', 'yyyyMMddHHmm.ss'
        )
        [IFormatProvider]$provider = [System.Globalization.CultureInfo]::InvariantCulture
        [System.Globalization.DateTimeStyles]$style = [System.Globalization.DateTimeStyles]::None
        [DateTime]$result = [DateTime]::MinValue;
        if( [DateTime]::TryParseExact($pstrDate, $formats, $provide, $style, [ref]$result) ) {
            return $result
        } else {
            return $null
        }
    }
    ToDate 04150101
    ToDate 1603202105.35
    ToDate 196311221230



    2017年4月18日 2:33
  • 動きました。ありがとうございました。

    Powershellというだけあって、シェルスクリプトのような構造だったのですね。

    サンプルなんかを見てるとその辺があいまいでよくわかっていませんでした。

    2017年4月21日 16:26