2013-03-13 2 views
-5

년 4 월 9, 2012 이러한 방법으로 쓸 수 날짜 : 이해하지 않는 당신의 사람들을 위해포맷을

4912 
4/9/12 
4-9-12 
4 9 12 
04-9-12 
04-09-12 
4 9 2012 
4 09 2012 
(I think you get the point) 

규칙은 다음과 같습니다

1. Dates may or may not have ` `, `-` or `/` between them 
2. The year can be written as 2 digits (assumed to be dates in the range of [2000, 2099] inclusive) or 4 digits 
3. One digit month/days may or may not have leading zeroes. 

가 어떻게 갈 것 04/09/12로 날짜를 형식화하기위한 문제 해결에 관해서?

날짜가 모호 할 수 있음을 알고 있습니다. 즉, 12112는 12/1/12 또는 1/21/12 일 수 있지만 가능한 가장 작은 월을 가정합니다.

+0

귀하의 질문에 당신이 준 형식의 수있는 날짜를 구문 분석하는 방법에 대한 것입니까? – lxop

+4

아니요, 모듈 없이는이 작업을 수행하지 마십시오. – mob

+0

글쎄, 구문 분석뿐만 아니라 그것을 구문 분석하고 요청한 형식으로 서식을 지정하십시오. – dtgee

답변

2

이것은 실제로 정규 표현식이 잘하는 것입니다. 그것을 전진하고, 필요한 경우 역 추적하여 성공적인 매치를 얻습니다. 월의 값에 의해 결정하지 않으면 서 (좋은 일이있는 곳)

s{ 
    \A 
    (1[0-2] | 0?[1-9]) 
    [-/ ]? 
    (3[01] | [12][0-9] | 0?[1-9]) 
    [-/ ]? 
    ((?: [0-9]{2}){1,2}) 
    \z 
} 
{ 
    sprintf '%02u/%02u/%04u', $1, $2, (length $3 == 4 ? $3 : 2000+$3) 
}xe; 

범위 확인 본, 모호한 경우에서 양호한 날짜를 선택하기에 충분해야한다.

먼저 두 자리 월 및 일을 사용해 보는 것이 중요합니다. 그렇지 않으면 111111은 아마도 11-11-11이 아닌 1-1-1111이됩니다. 그러나 이것은 11111이 1-11-11이 아닌 11-1-11을 선호한다는 것을 의미합니다.

유효한 달의 날 검사가 필요한 경우 다시 포맷해야합니다.

주 :

s{}{}는/탈출을 피하기 위해 정규식 부분을 구분하는 중괄호 대신를/이용한 교체하고, 또한 한 쌍의 분리를 사용하여 개구 패턴과 교환 모두 개폐를 할 수 있기 때문에 부품들, 나에게 잘 어울려.

\A은 일치되는 문자열의 시작과 일치합니다. \z이 끝과 일치합니다. ^$이 종종 사용되지만 경우에 따라 약간 다른 의미를 가질 수 있습니다. 그들은 항상 한 가지만 의미하기 때문에 나는 이것을 선호합니다.

끝에있는 x 플래그는 추가 공백 또는 무시할 수있는 주석을 가질 수있는 확장 된 정규식이며 더 읽기 쉽도록 말합니다. (문자 클래스 안의 공백은 무시되지 않습니다.) e 플래그는 교체 부분이 문자열이 아니며 실행될 코드임을 나타냅니다.

'%02u/%02u/%02u'은 printf 형식으로 값을 가져 와서 특정 방식으로 형식을 지정하는 데 사용됩니다. http://perldoc.perl.org/functions/sprintf.html을 참조하십시오.

+0

저는 여전히 Perl에 익숙하지 않으므로 코드가하는 것에 대해 의견을 말씀해 주시겠습니까? 나는'괄호'가'\ A' 또는'\ z' 또는'xe' 또는'% 02u/% 02u/% 02u'를하는지 모릅니다. – dtgee

+0

추가 설명; 다른 질문? – ysth

+0

그레이트 솔루션! 그러나 올해가 예를 들어 '04'인지 확인하고 처음에 '20'을 추가 한 다음 문자열을 다시 수집해야한다고 생각합니다. – dtgee

1

(4912 제외하고 4 9 2012 년 4 2012 09)이 모든 날짜에 읽을 수 있어야

우분투 libdate - 석회질 펄에 다음 출력 할 날짜 :: Calc를

설치 일반적인 형식으로

관련 문제