2017-08-09 15 views

答えて

2

VFPには、月の短縮文字列(または完全な月名)を解析する方法が組み込まれているとは思いません。それが私だったら、私はCASEステートメントをそれぞれの短縮月に使います。少しあなたは関数としてそれを作ると、繰り返し呼び出すことができ、スティーブが提供するものに拡張すること

lcStringDate = "30-Jul-17" 
lcDay = LEFT(lcStringDate, 2) 
lcMonth = SUBSTR(lcStringDate, 4, 3) 
lcYear = "20"+RIGHT(lcStringDate, 2) 

*!* Here you'd need to have code to convert abbreviated 
*!* month to a numeric month 
DO CASE 
    CASE lcMonth = "Jan" 
     lcNumericMonth = "1" 
    CASE lcMonth = "Feb" 
     lcNumericMonth = "2" 
    . 
    . 
    . 
ENDCASE 

?CTOD(lcNumericMonth+"/"+lcDay+"/"+lcYear) 
*!* this would output "07/30/17" if SET CENTURY is OFF 
*!* this would output "07/30/2017" if SET CENTURY is ON 
+1

ありがとうございます。私はもっ​​と簡単な方法を望んでいましたが、これはうまくいくでしょう。 – Nick

1

...

lcDate = "30-Jul-17" 
    ? DMYToDate(lcDate) 

    lcDate = "15-August-17" 
    ? DMYToDate(lcDate) 

    lcDate = "29-Feb-17" && No such feb 29, 2017 
    ? DMYToDate(lcDate) 

    lcDate = "32-Mar-17" && no month 32 days 
    ? DMYToDate(lcDate) 


FUNCTION DMYToDate 
LPARAMETERS lcTryDate 
    local lnDay, lnYear, lcMonth, tmpDate, ldNewDate 
    lnDay = INT(VAL(LEFT(lcTryDate, 2))) 
    lnYear = 2000 + INT(VAL(RIGHT(lcTryDate, 2))) 
    lcMonth = SUBSTR(lcTryDate, 4, 3) 

    */ Cycle through each month with arbitrary start date... 
    tmpDate = DATE(2000,1,1) 
    DO WHILE YEAR(tmpDate) < 2001 
     IF ATC(lcMonth, CMONTH(tmpDate)) = 1 
      EXIT 
     ENDIF 
     tmpDate = GOMONTH(tmpDate, 1) 
    ENDDO 
    IF YEAR(tmpDate) > 2000 
     */ No such month found, return empty date. 
     RETURN CTOD("" ) 
    ENDIF 

    TRY 
     ldNewDate = DATE(lnYear, MONTH(tmpDate), lnDay) 
    CATCH 
     ldNewDate = CTOD("") 
    ENDTRY 

    RETURN ldNewDate 
ENDFUNC 
0

はこれを試してみてください:

「」あなたの日付文字列である

DATE(2000+VAL(SUBSTR(a,8,2)),int((AT(SUBSTR(UPPER(a),4,3),"JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC")-1)/3)+1,VAL(SUBSTR(a,1,2))) 
関連する問題