2017-01-17 4 views
1

2 줄의 코드에 문제가 있습니다. 예상대로 작동하지 않습니다. 요점은 DateTime 개체가 명시적인 형식 지정없이 기본 변환을 사용하여 string으로 변환되고 다시 DateTime으로 변환된다는 것입니다.Powershell v5에서 datetime 변환 오류가 발생했습니다

$timeString = [DateTime]::Now.ToString() # contains 17.01.2017 20:01:30 
$time = [DateTime]$timeString # PS blows with error 

그래서 기본적으로 기본 날짜 형식을 사용하여 문자열의 형식을 지정하지만 다른 형식을 사용하여 다시 구문 분석합니다.

$otherTime = [DateTime]"01/17/2017 20:01:30" # will get the initial date 

사람이 유형 변환의 문제에 대한 적절한 문서 날 지점 수, 그리고 왜이 경우에는 앞뒤로 데이터를 변환하는 다른 형식을 사용합니다 : 다음의 코드는하지만, 작동합니까?

미리 감사드립니다.

+0

문제를 재현 할 수 없습니다. 첫 번째 스크립트 블록은 정상적으로 작동했습니다. –

+2

'[string] [DateTime] :: Now' 또는'[DateTime] :: Now.ToString ([CultureInfo] :: InvariantCulture)'를 사용하십시오. – PetSerAl

답변

2

파싱 날짜는 항상 악몽입니다. 특히 '외부 미국'이라고하는 작은 세계에 살고있는 경우 :

일반적으로 .NET의 날짜 및 구문 분석 날짜 (및 기타 문자열 비교)는 문화권 설정에 의해 제어됩니다. 경우에 따라 기본 동작은 현재 문화권 설정을 사용하는 것입니다. Convert.ToDateTime이 그 중 하나입니다. 이 문서 (Convert.ToDateTime Method (String))로 살펴 경우는 말한다 :

값이 null이 아닌 경우

는, 반환 값이 DateTimeFormatInfo의 형식 정보를 사용하여 값에 DateTime.Parse 메서드를 호출 한 결과입니다 현재 문화권에 대해 초기화 된 인 개체. value 인수에는 DateTimeFormatInfo 항목에서 설명하는 형식 중 하나의 날짜 및 시간 표현 이 포함되어야합니다.

그래서 현지화 된 날짜 문자열을 변환합니다. 다른 경우 기본 동작은 '불변 문화'설정을 사용하는 것으로 '미국 설정'을 의미합니다. 대부분의 메서드는 오버로드되어 사용해야 할 문화권을 지정하는 매개 변수를 사용할 수 있지만 .NET 설명서에는 약간의 검색이 필요합니다.

어림짐작 : 최종 사용자에게 표시되지 않을 경우 현지화 된 문자열을 사용하지 마십시오. 항상 메서드의 '불변 문화'변형을 찾고 문자열의 서식을 지정하고 파싱하는 데 사용하십시오. 그것은 많은 두통에서 당신을 구할 것입니다.

2

암시 적으로 Convert.ToDateTime(String)을 호출하지만이 메서드의 유효한 형식은 하드 코드되어 있으므로 나열되지 않습니다. 출력 날짜 형식에서 미국에 있지 않은 것으로 보입니다. 아마도 대부분의 형식이 중심이 될 것입니다.

대신 Convert.ToDateTime(String, IFormatProvider)을 명시 적으로 사용하여 원하는 문화 양식 제공 업체에 알릴 수 있습니다.

[Convert]::ToDateTime($timeString, [System.Globalization.DateTimeFormatInfo]::CurrentInfo) 

나는 미국 시스템에 있기 때문에 아직 작동하는지 확실하지 않습니다.

[DateTime]::TryParse() 또는 [DateTime]::TryParseExact()을 사용하여 원하는 형식을 명시 적으로 지정할 수도 있습니다.

+0

예, 다른 문화권을 사용합니다. 여기서 형식은'dd.MM.yyyy'이고 구분 기호는'점 '입니다. 더 많은 조사가 있었고'[System.Convert] :: ToDateTime ("01/18/2017")'이 예외를 던지면서'[System.Convert] :: ToDateTime ("18.01.2017")'return 1 월, 18 일의 유효한 날짜. 그래서, 적어도 매개 변수가없는 "Convert.ToDateTime"메서드를 호출하는 것처럼 보이지 않습니다. 어쩌면 그것은 불변의 문화를 알게 될 것입니다. – kosmakoff

+0

기본적으로, 제 질문은 해결 방법에 관한 것이 아니라 작동 원리에 대한 기술적 설명에 관한 것입니다. 어쩌면 우리는 어딘가에 버그를 제출할 필요가 있습니다 :) – kosmakoff