elexy 发表于 2020-4-20 16:53:12

[已解决]日期格式分隔符相互转换UDF

本帖最后由 elexy 于 2020-4-20 21:31 编辑

$str=20200407
$expstr = '2020/4/7'   ;不满2位不带0的日期格式
各位老师好,两种日期如何实现简便的【双向】转换,自己写的很拙劣,看不下去了,有没有UDF或是优雅的写法?感谢赐教

afan 发表于 2020-7-8 11:04:53

本帖最后由 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:51:38

本帖最后由 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

elexy 发表于 2020-4-20 21:30:51

MsgBox(0, _DateSepFormat($str, '/'), _DateSepFormat($expstr))
完美解决,感谢超版的无敌正则,神乎其技。

fyq 发表于 2020-7-8 10:43:05

老大,还有点问题,你将Local $str = 20200418改为Local $str = 20201018试一下,会是2020/1/18
页: [1]
查看完整版本: [已解决]日期格式分隔符相互转换UDF