[已解决]日期格式分隔符相互转换UDF
本帖最后由 elexy 于 2020-4-20 21:31 编辑$str=20200407
$expstr = '2020/4/7' ;不满2位不带0的日期格式
各位老师好,两种日期如何实现简便的【双向】转换,自己写的很拙劣,看不下去了,有没有UDF或是优雅的写法?感谢赐教
本帖最后由 afan 于 2020-7-8 11:13 编辑
fyq 发表于 2020-7-8 10:43
老大,还有点问题,你将Local $str = 20200418改为Local $str = 20201018试一下,会是2020/1/18
的确是,需改一下
Local $str = 20201018;20200418
Local $expstr = '2020/4/17'
MsgBox(0, '不要分隔符', $str & ' -> ' & _DateSepFormat($str) & @LF & _
$expstr & ' -> ' & _DateSepFormat($expstr))
MsgBox(0, '使用 / 分隔符', $str & ' -> ' & _DateSepFormat($str, '/') & @LF & _
$expstr & ' -> ' & _DateSepFormat($expstr, '/'))
MsgBox(0, '使用 - 分隔符', $str & ' -> ' & _DateSepFormat($str, '-') & @LF & _
$expstr & ' -> ' & _DateSepFormat($expstr, '-'))
Func _DateSepFormat($sDate, $sSep = '') ; 日期有否分隔符互转
;~ ###(日期,分隔符)
If $sSep = '' Then
If StringRegExp($sDate, '^\d{8}$') Then Return $sDate
Local $aData = StringRegExp($sDate, '^(\d{4})\D+(\d{1,2})\D+(\d{1,2})$', 1)
If @error Then Return SetError(1, 0, '')
Return StringFormat('%s%02s%02s', $aData, $aData, $aData)
EndIf
If StringRegExp($sDate, '^\d{8}$') Then
Local $aData = StringRegExp($sDate, '^(....)(?|0(.)|(..))(?|0(.)|(..))$', 1)
Else
Local $aData = StringRegExp($sDate, '^(\d{4})\D+(\d{1,2})\D+(\d{1,2})$', 1)
EndIf
If @error Then Return SetError(1, 0, '')
Return $aData & $sSep & $aData & $sSep & $aData
EndFunc ;==>_DateSepFormat 本帖最后由 afan 于 2020-4-20 19:56 编辑
Local $str = 20200418
Local $expstr = '2020/4/17'
MsgBox(0, '不要分隔符', $str & ' -> ' & _DateSepFormat($str) & @LF & _
$expstr & ' -> ' & _DateSepFormat($expstr))
MsgBox(0, '使用 / 分隔符', $str & ' -> ' & _DateSepFormat($str, '/') & @LF & _
$expstr & ' -> ' & _DateSepFormat($expstr, '/'))
MsgBox(0, '使用 - 分隔符', $str & ' -> ' & _DateSepFormat($str, '-') & @LF & _
$expstr & ' -> ' & _DateSepFormat($expstr, '-'))
Func _DateSepFormat($sDate, $sSep = '') ; 日期有否分隔符互转
;~ ###(日期,分隔符)
If $sSep = '' Then
If StringRegExp($sDate, '^\d{8}$') Then Return $sDate
Local $aData = StringRegExp($sDate, '^(\d{4})\D+(\d{1,2})\D+(\d{1,2})$', 1)
If @error Then Return SetError(1, 0, '')
Return StringFormat('%s%02s%02s', $aData, $aData, $aData)
EndIf
If StringRegExp($sDate, '^\d{8}$') Then
Local $aData = StringRegExp($sDate, '(....)(?:0?(.|..))(?:0?(.|..)$)', 1)
Else
Local $aData = StringRegExp($sDate, '^(\d{4})\D+(\d{1,2})\D+(\d{1,2})$', 1)
EndIf
If @error Then Return SetError(1, 0, '')
Return $aData & $sSep & $aData & $sSep & $aData
EndFunc ;==>_DateSepFormat MsgBox(0, _DateSepFormat($str, '/'), _DateSepFormat($expstr))
完美解决,感谢超版的无敌正则,神乎其技。 老大,还有点问题,你将Local $str = 20200418改为Local $str = 20201018试一下,会是2020/1/18
页:
[1]