전체 ISO 8601 형식이 수 '에서 유용한 무언가를 얻을 필요 단일 패턴 매치로 끝내야합니다. 너무 많은 변형이 있습니다.
YYYY-MM-DD
대 :
- 이 아닌 별도의 번호를 수행하는 "압축"형식이
YYYY-MM-DD
및 YYYY-MM
모두 유효한 날짜입니다
- 서수 날짜도 유효합니다.
YYYY-DDD
여기서 DDD
은 일 (1-365/6)입니다.
- t
hh:mm:ss
, hh:mm
및 hh
는 또한
- 이 시간은 또한 압축 된 버전은 모든 유효한 배 : IME는 분 및 초 ommited 될 수
hhmmss
을
- 그리고 그 위에
hhmm
은 시간은 사용 을 분획을 받아 둘 시간 부분에 더 낮은 시간 요소의 분수를 나타내는 점 또는 쉼표. 14:30,5
, 1430,5
, 14:30.5
또는 1430.5
은 모두 14 시간 30 초 반을 나타냅니다.
- 마지막으로, 시간대 섹션은 선택 사항입니다. 문자가있는 경우 문자 Z,
±hh:mm
, ±hh
또는 ±hhmm
이 될 수 있습니다.
전체 사양에 따라 구문 분석 할 경우 고려해야 할 예외가 많이 있습니다.
function parseDateTime(str)
local Y,M,D = parseDate(str)
local h,m,s = parseTime(str)
local oh,om = parseOffset(str)
return os.time({year=Y, month=M, day=D, hour=(h+oh), min=(m+om), sec=s})
end
을 그리고 당신은 parseDate
, parseTime
및 parseOffset
을 만들어야 할 것입니다 :이 경우, 초기 코드는 다음과 같을 수 있습니다. 나중에는 UTC의 시간 오프셋을 반환해야하며 처음 두 개는 압축 된 형식, 시간 분수, 쉼표 또는 점 분리 기호 등과 같은 사항을 고려해야합니다.
parseDate
은 패턴 일치 시작 부분에문자를 사용할 가능성이 있습니다. 그 이유는 날짜가 문자열의 시작 부분에 있어야하기 때문입니다.parseTime
님의 패턴은 "T"
으로 시작합니다. 그리고 parseOffset
은 "$"
으로 끝날 것입니다. 시간 오프셋은 존재할 때 마지막에 있기 때문입니다.
A "전체 ISO"parseOffset
기능이 유사 있습니다
function parseOffset(str)
if str:sub(-1)=="Z" then return 0,0 end -- ends with Z, Zulu time
-- matches ±hh:mm, ±hhmm or ±hh; else returns nils
local sign, oh, om = str:match("([-+])(%d%d):?(%d?%d?)$")
sign, oh, om = sign or "+", oh or "00", om or "00"
return tonumber(sign .. oh), tonumber(sign .. om)
end
을 그건 그렇고, 당신의 컴퓨터가 UTC 시간에 작동하고 있음을 가정하고있다. 그렇지 않은 경우에는이를 고려하여 시간당 몇 분의 오프셋을 추가해야합니다.
function parseDateTime(str)
local Y,M,D = parseDate(str)
local h,m,s = parseTime(str)
local oh,om = parseOffset(str)
local loh,lom = getLocalUTCOffset()
return os.time({year=Y, month=M, day=D, hour=(h+oh-loh), min=(m+om-lom), sec=s})
end
로컬 오프셋을 얻으려면 http://lua-users.org/wiki/TimeZone을 참조하십시오.
이 정보가 도움이되기를 바랍니다. 문안 인사!
BTW kikito의 대답은 좋습니다; 많은 메모와 많은 도구들이 ISO 스타일의 날짜 - 시간을 그런 식으로 작성하기 때문에 날짜/시간을 구분하기 위해 'T'뿐만 아니라 '(공백)을 받아들이는 것이 좋을지도 모른다. 'T'를 사용하십시오!). – snogglethorpe
그 포인터 주셔서 감사. 내 경우에는 패턴이 너무 많아 걱정할 필요가 없습니다. 2011-10-25T00 : 29 : 55.503-04 : 00 –