Что нового

Время, дата Функция _StringToDate() "выхватывает" дату из строки, в которой содержится какое либо человеческое упоминание даты

Vic58

Новичок
Сообщения
18
Репутация
2
Версия AutoIt
3.3.14.5
Версия
1.0
Давно собирался выложить, но... так и недоделал в части выделения time, хотя это нетрудно. Но этого самого time у меня нет.
Буду благодарен за доработки.
Код:
#CS
    Name:                _StringToDate.au3
    Description:        Функция _StringToDate() "выхватывает" дату из строки, в которой содержится какое либо человеческое упоминание даты на
                        определяемом пользователем языке (по умолчанию: английский, русский), и преобразует в формат даты AutoIt.
    Author:                Copyright © 2019 Vic58.
    AutoIt version:        3.3.6.1 - 3.3.14.5
    UDF version:        1.0

 Syntax:        _StringToDate($InpStrDate [, $patt_ymd [, $NatMnt3Sym]])
 Parameters:    $InpStrDate        - Строка содержащая дату
                $patt_ymd        - Шаблон порядка выборки = строке из комбинации трех символов "ymd" - год,месяц,день,
                                  по умолчанию "dmy", или строка "rnd", указывающая на непредсказуемый порядок следования
                                  год,месяц,день в исходной строке, в этом случае при преобразовании возможны неточности.
                $NatMnt3Sym        - Национальное трехсимвольное сокращение названий месяцев, по умолчанию:
                                  ="янвфевмарапрмайиюниюлавгсеноктноядек"
                Return values:    Success   - Возвращает дату в формате "YYYY/MM/DD"
                                Failure   - Возвращает пустую строку.
Example:
#CE
#CS

$sdat='ее день рожденья 17 апреля 1961'
MsgBox(0,"",_StringToDate($sdat))

MsgBox(0,"",_StringToDate("30-12-19"))

$sdat='В марте 2020 года, числа примерно 12-го, губернатор издал постановление "О мерах противодействия пандемии"'
MsgBox(0,"",_StringToDate($sdat,"rnd"))

#CE


Func _StringToDate($InpStrDate, $patt_ymd = "dmy", $NatMnt3Sym="янвфевмарапрмайиюниюлавгсеноктноядек")
    Local $liter, $Time, $aVar, $Tmpstr, $Count, _
        $Mnt, $Day, $Year, $iCentury=2000

    $patt_ymd = StringLower($patt_ymd)
     $Count = StringInStr($InpStrDate, ":")
;    If StringInStr($InpStrDate, " ") Then
    If $Count Then
;~         $Time = StringMid($InpStrDate, $i)
;~         $InpStrDate = StringStripWS(StringLeft($InpStrDate, $i - 1),3)

    EndIf
;~         $Time = ""
    $InpStrDate = StringReplace($InpStrDate, "-", " ")
    $InpStrDate = StringReplace($InpStrDate, "/", " ")
    $InpStrDate = StringReplace($InpStrDate, ".", " ")
    $InpStrDate = StringStripWS($InpStrDate,3)

    $aVar = StringSplit($InpStrDate, " ")
    If @Error Then return ""  ;Error
    $Count=0
    For $i = 1 To UBound($aVar)-1
If $Count = 3 Then ExitLoop
      $Tmpstr = $aVar[$i]
      if $patt_ymd = "rnd" Then
        If StringIsDigit($Tmpstr) Then
;~             $Count += 1
        Local $TmpVal=Int($Tmpstr)
            Select
                case $TmpVal>0 and $TmpVal<32 and Not $Day
                    $liter='d'
                case $TmpVal>0 and $TmpVal<13 and Not $Mnt
                    $liter='m'
                case StringLen($TmpVal)=4
                    $liter='y'
            EndSelect
        Else
                         $Tmpstr = StringLower(StringLeft($Tmpstr, 3))
                       For $j = 1 To 34 Step 3
                            If $Tmpstr = StringMid("janfebmaraprmayjunjulaugsepoctnovdec", $j, 3) Then
                                $Mnt = ($j + 2)/3
            $Count += 1
                                ContinueLoop
                            ElseIf $Tmpstr = StringMid($NatMnt3Sym, $j, 3) Then
                                $Mnt = ($j + 2)/3
            $Count += 1
                                ContinueLoop
                            EndIf
                        Next ;j
                                ContinueLoop
        EndIf
      else
          $liter=StringMid($patt_ymd, $Count+1, 1)
      EndIf
        If StringLen($Tmpstr) Then
;~             $Count += 1
;~             If $Count = 4 Then return ""  ;Error
            Switch $liter
                Case "d"
                    If StringIsDigit($Tmpstr) Then
                        $Day = Int($Tmpstr)
            $Count += 1
                        If $Day < 1 Or $Day > 31 Then return ""  ;Error
                    EndIf
                Case "m"
                    If StringIsDigit($Tmpstr) Then
                        $Mnt = Int($Tmpstr)
            $Count += 1
                        If $Mnt < 1 Or $Mnt > 12 Then return ""  ;Error
                    Else
                        $Tmpstr = StringLower(StringLeft($Tmpstr, 3))
                        For $j = 1 To 34 Step 3
                            If $Tmpstr = StringMid("janfebmaraprmayjunjulaugsepoctnovdec", $j, 3) Then
                                $Mnt = ($j + 2)/3
            $Count += 1
                                ContinueLoop
                            ElseIf $Tmpstr = StringMid($NatMnt3Sym, $j, 3) Then
                                $Mnt = ($j + 2)/3
            $Count += 1
                                ContinueLoop
                            EndIf
                        Next ;$j
                    EndIf
                    If $Mnt = 0 Then return ""  ;Error
                Case "y"
                    If StringIsDigit($Tmpstr) Then
                        $Year = Int($Tmpstr)
                        $Year = ($Year<100 ? $Year + $iCentury : $Year)
            $Count += 1
;~                         If $Year<50 Then $Year+=$Century
                    EndIf
;~                 Case Else
;~                     return ""  ;Error
            EndSwitch
        EndIf
If $Count = 3 Then ExitLoop
;~       EndIf
    Next ;$i
            If $Count < 3 Then return ""  ;Error

    Return $Year&'/'&$Mnt&'/'&$Day

EndFunc
 
Автор
Vic58

Вложения

  • _StringToDate.zip
    1.9 КБ · Просмотры: 1
Верх