Visual foxpro Visual FoxPro字符串到日期的转换

Visual foxpro Visual FoxPro字符串到日期的转换,visual-foxpro,string-to-datetime,Visual Foxpro,String To Datetime,如何将字符串30-Jul-17转换为日期格式07/30/17?我认为VFP中没有内置的方法来解析缩写的月份字符串(甚至是完整的月份名称)。如果是我的话,我会用一个案例来说明每个月的情况 lcStringDate = "30-Jul-17" lcDay = LEFT(lcStringDate, 2) lcMonth = SUBSTR(lcStringDate, 4, 3) lcYear = "20"+RIGHT(lcStringDate, 2) *!* Here you'd need to ha

如何将字符串
30-Jul-17
转换为日期格式
07/30/17

我认为VFP中没有内置的方法来解析缩写的月份字符串(甚至是完整的月份名称)。如果是我的话,我会用一个案例来说明每个月的情况

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

要稍微扩展Steve提供的内容,可以将其作为函数并重复调用

    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
lcDate=“2017年7月30日”
? DMYToDate(lcDate)
lcDate=“2017年8月15日”
? DMYToDate(lcDate)
lcDate=“29-Feb-17”&&2017年2月29日没有
? DMYToDate(lcDate)
lcDate=“2017年3月32日”与否月份32天
? DMYToDate(lcDate)
函数DMYToDate
lcTryDate参数
本地lnDay、lnYear、lcMonth、TMUpdate、ldNewDate
lnDay=INT(VAL(左(lcTryDate,2)))
lnYear=2000+INT(VAL(右(lcTryDate,2)))
LCMOUNT=SUBSTR(lcTryDate,4,3)
*/以任意开始日期循环每个月。。。
tmpDate=日期(2000,1,1)
年份(tmpDate)<2001
如果ATC(lcMonth,CMMonth(tmpDate))=1
出口
恩迪夫
tmpDate=GOMONTH(tmpDate,1)
恩多
如果年份(tmpDate)>2000
*/未找到该月份,返回空日期。
返回CTOD(“”)
恩迪夫
尝试
ldNewDate=日期(年、月、日)
抓住
ldNewDate=CTOD(“”)
末日
返回ldNewDate
ENDFUNC
试试这个:

“a”是您的日期字符串

DATE(2000+VAL(SUBSTR(a,8,2)),int((AT(SUBSTR(UPPER(a),4,3),"JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC")-1)/3)+1,VAL(SUBSTR(a,1,2)))

谢谢你的主意。我希望有一个更简单的方法,但这会奏效的。