- Версия 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