2013-07-25 46 views
0

我想我所有的日期統一爲這隻格式:模式在Lua:統一不同的輸入日期格式

"D+/M+/YYYY H+:N+" 

我有這樣的投入:

-- DD/MM/YYYY 
24/09/1986 
1/09/1986 
01/9/1986 

-- DD-MM-YYYY 
24-09-1986 
1-09-1986 
01-9-1986 


05/12/2012 0:00:00 
09/24/2012 
24/9/1986 00:01 
24/9/1986 0:1 
24/9/1986 03:01 p.m. 
24/9/1986 3:01 p.m. 
24/9/1986 0:1 A.M. 
24/9/86 
24/9/86 03:01 p.m. 
24/9/86 3:1 A.M. 
24/9/86 00:01 
24/9/86 0:1 
24-09-1986 12:12 
24-09-1986 12:12 
24-09-1986 12:12 
24-09-1986 12:12 

我知道,我可以做出類似這樣的事情:

p= '%d+/%d+/%d%d%d%d %d%d:%d%d [AP]M' 
if string.match('6/5/2013 12:06 PM',p) then print('ok') else print('not ok') end 

我已經計劃做一個if-else anidation。但是,正如你所看到的,輸入格式有很多可能性。你能否給我建議一個最聰明的解決方案?

例如,我已經做了這樣的功能:

function opUnifyDateFormat(config, section, document) 
local trazas = assert(io.open("D:\\LogsApp\\Autonomy\\Desarrollos\\ScriptsLua\\CommonFunctions\\trazas_Lua_opUnifyDateFormat.log", "a")) 
    trazas:write(os.date().." **************************** opReferenciaDREREFERENCE "..document:getFieldValue("DREREFERENCE").."\n") 

    --DATE ORIGIN-- 
    --SHRPNT2010-- 
    local inputDateShp1 = document:getFieldValue("SP_Created") 
    local inputDateShp2 = document:getFieldValue("SP_Modified") 
    local inputDateShp3 = document:getFieldValue("SP_Published") 
    --DCTM-- 
    local inputDateDCTM11 = document:getFieldValue("fecaprob") 
    --DCTM2-- 
    local inputDateDCTM21 = document:getFieldValue("attr_fechadoc") 
    local inputDateDCTM22 = document:getFieldValue("r_modify_date") 

    local OutputFormatForAnio="DD/MM/YYYY" 
    local OutputFormatForFechaConsulta="DD/MM/YYYY HH:MM" 

    --LIST OF INPUT FORMATS-- 
    --('(%d+)[/-](%d+)[/-](%d+)%s*(%d*):?(%d*):?(%d*)%s*([apAP]?)')('%s/%s/%s %d:%d') 
    --SPANISH-- 
    local esFormat0='%d+/%d+/%d%d%d%d' 
    local esInputFormatCSV0="D+/M+/YYYY"  
    local esFormat1='%d+/%d+/%d%d%d%d %d+:%d+' 
    local esInputFormatCSV1="D+/M+/YYYY H+:N+" 
    local esFormat2='%d+/%d+/%d%d%d%d %d+:%d+:%d+' 
    local esInputFormatCSV2="D+/M+/YYYY H+:N+:S+" 
    local esFormat3='%d+/%d+/%d%d%d%d %d+:%d+ [AP]M' 
    local esInputFormatCSV3="D+/M+/YYYY H+:N+ #PM" 
    local esFormat4='%d+/%d+/%d%d%d%d %d+:%d+:%d+ [AP]M' 
    local esInputFormatCSV4="D+/M+/YYYY H+:N+:S+ #PM" 
    --PORTUGUESE-- 
    local ptFormat0='%d+-%d+-%d%d%d%d' 
    local ptInputFormatCSV0="D+-M+-YYYY"  
    local ptFormat1='%d+-%d+-%d%d%d%d %d+:%d+' 
    local ptInputFormatCSV1="D+-M+-YYYY H+:N+" 
    local ptFormat2='%d+-%d+-%d%d%d%d %d+:%d+:%d+' 
    local ptInputFormatCSV2="D+-M+-YYYY H+:N+:S+" 
    local ptFormat3='%d+-%d+-%d%d%d%d %d+:%d+ [AP]M' 
    local ptInputFormatCSV3="D+-M+-YYYY H+:N+ #PM" 
    local ptFormat4='%d+-%d+-%d%d%d%d %d+:%d+:%d+ [AP]M' 
    local ptInputFormatCSV4="D+-M+-YYYY H+:N+:S+ #PM" 

    --SP_CREATED-- 
    if inputDateShp1 ~= "" and inputDateShp1 ~= nil then 
     trazas:write(os.date().." inputDateShp1 = "..inputDateShp1,"\n") 

     --"D+/M+/YYYY" 
     if string.match(inputDateShp1,esFormat0) then   
      trazas:write(os.date().." esFormat0 = "..esFormat0,"\n") 
      InputFormatCSV=esInputFormatCSV0    


     --"D+/M+/YYYY H+:N+" 
     elseif string.match(inputDateShp1,esFormat1) then   
      trazas:write(os.date().." esFormat1 = "..esFormat1,"\n") 
      InputFormatCSV=esInputFormatCSV1    


     --"D+/M+/YYYY H+:N+:S+" 
     elseif string.match(inputDateShp1,esFormat2) then   
      trazas:write(os.date().." esFormat2 = "..esFormat2,"\n") 
      InputFormatCSV=esInputFormatCSV2    


     --"D+/M+/YYYY H+:N+ #PM" 
     elseif string.match(inputDateShp1,esFormat3) then   
      trazas:write(os.date().." esFormat3 = "..esFormat3,"\n") 
      InputFormatCSV=esInputFormatCSV3    


     --"D+/M+/YYYY H+:N+:S+ #PM" 
     elseif string.match(inputDateShp1,esFormat4) then   
      trazas:write(os.date().." esFormat4 = "..esFormat4,"\n") 
      InputFormatCSV=esInputFormatCSV4       
     end  
    end 
    trazas:write(os.date().." FIN IF SP_CREATED \n")  

    trazas:write(os.date().." Formato fecha ES OK!!--> "..InputFormatCSV,"\n")  
    fechaFinalAnio=convert_date_time(inputDateShp1,InputFormatCSV,OutputFormatForAnio,false)    
    fechaFinalFechaConsulta=convert_date_time(inputDateShp1,InputFormatCSV,OutputFormatForFechaConsulta,false)  
    trazas:write(os.date().." fechaFinalAnio ES --> "..fechaFinalAnio,"\n")  
    trazas:write(os.date().." fechaFinalFechaConsulta ES --> "..fechaFinalFechaConsulta,"\n") 

    if fechaFinalAnio ~= "" and fechaFinalAnio ~= nil then 
     cridolAnio=startAtChars(document, fechaFinalAnio, "/,3") 
     document:addField("CRIDOL_ANIO",cridolAnio)  
    end 
    cridolFechaConsulta=convert_date_time(inputDateShp1,InputFormatCSV,"EPOCHSECONDS",false) 
    document:addField("CRIDOL_FECHA_CONSULTA",cridolFechaConsulta)    

    trazas:write(os.date().." CRIDOL_ANIO= "..cridolAnio,"\n") 
    trazas:write(os.date().." CRIDOL_FECHA_CONSULTA= "..cridolFechaConsulta,"\n") 

    trazas:write(os.date().." DONE \n") 
    -- flush y cerrar 
    trazas:flush() 
    trazas:close() 
end 

謝謝!

+0

「一個最聰明的解決方案」來做什麼,到底是什麼?匹配所有這些日期的變化? –

+2

準備一些頭痛。你怎麼知道1986年9月1日意味着1986年9月1日而不是1986年1月9日?也許如果你陳述了你正在努力解決的問題,我們可以給你一些關於如何進行的更好的想法? –

+0

好吧,一步一步忘記MM/DD/YYYY的選項,只有DD/MM/YYYY。我寫的LUA中的正則表達式就是一個例子,它需要幾種格式,但不是全部。我怎麼能說....如果是這種輸入格式,將其轉換爲EPOCH。我編輯了我的第一條評論。 – AlexMJ

回答

1

'%d + /%d + /%d%d%d%d%d%d:%d%d [AP] M'

這一個是硬編碼爲僅允許/作爲一個分隔符。您可以使用一組來允許/- 1(即[/-])。您可以使用'*'來指示零個或多個接受可選參數。例如,這種模式將處理您的所有示例:

local day, month, year, hour, minute, seconds, meridiem 
    = input:match('(%d+)[/-](%d+)[/-](%d+)%s*(%d*):?(%d*):?(%d*)%s*([apAP]?)') 
('%s/%s/%s %d:%d'):format(day, month, year, tonumber(hour) or 0, tonumber(minute) or 0)) 

還有細節需要解決。只是給你這個想法。

+0

我一直在我正在談論的解決方案中工作......我想製作更好的代碼,也許我怎麼能使用表格?我編輯了我的帖子。我應該爲「InputDateXXXX」的其餘部分重複所有--SP_CREATED--部分。謝謝! – AlexMJ

+0

您能否請至少給我一個關於我自己的代碼的例子? :(我是用Lua編程的新手......我不明白你的意思,「這應該是一個紅旗,你做錯了,這些數字應該是索引到一個容器中。」 – AlexMJ