トップ回答者
関数内でパラメータを使って[DateTime]::ParseExactを呼び出すと例外が発生する

質問
-
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
回答
-
> $DateParam = Str2Date('20171211', 'yyyyMMdd')
関数の呼び出しを
$DateParam = Str2Date 20171211 yyyyMMdd
に変更してみてください。
元の呼び出し方ですと、$pstrDate に「20171211 yyyyMMdd」、$pstrFormat に「」が渡されます。
これは『('20171211', 'yyyyMMdd')』が、2 つの String 値を持つ Object 配列として認識されるためです。
- 回答の候補に設定 牟田口大介Moderator 2017年4月16日 23:39
- 回答としてマーク ミoωoミ 2017年4月21日 16:25
すべての返信
-
ミoωoミ さま よろしく。
日付型の初期値は 0001/01/01 0:00:00 ( '0001/1/1 0:0:0' ) だった気がしますが?。 最初に $null をセットしているのを変えてみては如何でしょうか?。
違っていたら、ごめんなさい。
- 編集済み ShiroYuki_Mot 2017年4月15日 17:08 自信ないので
-
> $DateParam = Str2Date('20171211', 'yyyyMMdd')
関数の呼び出しを
$DateParam = Str2Date 20171211 yyyyMMdd
に変更してみてください。
元の呼び出し方ですと、$pstrDate に「20171211 yyyyMMdd」、$pstrFormat に「」が渡されます。
これは『('20171211', 'yyyyMMdd')』が、2 つの String 値を持つ Object 配列として認識されるためです。
- 回答の候補に設定 牟田口大介Moderator 2017年4月16日 23:39
- 回答としてマーク ミoωoミ 2017年4月21日 16:25
-
> 日付を[[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
- 編集済み 魔界の仮面弁士MVP 2017年4月18日 2:35