Что нового

Преобразование даты в текстовый формат

Sverx

Новичок
Сообщения
5
Репутация
0
Подскажите как получить из даты формата 21.12.2015
- Дату формата 21 декабря 2015 г.
Гуглил, искал по форуму и в справке, но простой функции так и не нашел =(...
UPD: Сделал костыль :laugh: :blink:, так как путного ничего не нашел (Ну я еще и новичок опыт меньше 3-х дней)...
Костыль вот в чем, - эта дата берется из Gui точнее из:
Код:
$q[0] = GUICtrlCreateDate ( "", 200, 20, 100, 20, $WS_TABSTOP)

Я подставил его на вход другой такой функции,предварительно конвертировав, а после сделал удаление для того, что бы оно не маячило глаза и ни как не мешало:
Код:
$DATA=StringRegExpReplace(GUICtrlRead($q[0]),'(\d{2}).(\d{2}).(\d{4})','$3/$2/$1')
$q[1] = GUICtrlCreateDate ( $DATA, 200, 20, 100, 20)
$Dateprop = GUICtrlRead($q[1])
GUICtrlDelete($q[1])

Почему так?:
Дело в том что мне надо, что бы выбирать дату надо было один раз, а даты нужны в двух форматах ...
Но если есть варианты более простые был бы рад услышать :beer:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Sverx [?]
как получить из даты формата 21.12.2015
- Дату формата 21 декабря 2015 г.

Код:
$sDate = _Date_Formate('21/12/2015', 'dd mmm~ yyyy г.', 1)
MsgBox(0, @ScriptName, $sDate)

Func _Date_Formate($sDate, $sRetFormat = -1, $iLocale = 0, $iReplaceCount = 1)
	Local $sDelims_Pattern, $sDay_Pattern, $sMonth_Pattern, $sYear_Pattern, $sSearch_Pattern, $sDay, $sMonth, $sYear, $iMode
	
	$sDelims_Pattern = '[\Q /\.,\E]+'
	$sDay_Pattern = '(\d{1,2})'
	$sMonth_Pattern = '(\d{1,2}|[январьфелмтпйиюгусбокд]{3,8}|[decmbrnovtspaugjlyihf]{3,9})'
	$sYear_Pattern = '(\d{4})\h?(?:г\.)?'
	
	$sSearch_Pattern = '(?i)' & $sDay_Pattern & $sDelims_Pattern & $sMonth_Pattern & $sDelims_Pattern & $sYear_Pattern
	
	Switch $sRetFormat
		Case -1, Default
			Return StringRegExp($sDate, $sSearch_Pattern, 3)
		Case Else
			$sDay = StringRegExpReplace($sDate, $sSearch_Pattern, '\1')
			$sMonth = StringRegExpReplace($sDate, $sSearch_Pattern, '\2')
			$sYear = StringRegExpReplace($sDate, $sSearch_Pattern, '\3')
			
			If StringIsDigit($sMonth) And Not StringRegExp($sRetFormat, '(?i)[^m]mm?[^m]') Then
				$iMode = 0
				
				If StringInStr($sRetFormat, 'mmm~') Then ;Needs to be expanded - for our reach russian language :)
					$iMode = 1
				EndIf
				
				$sMonth = _DateMonthIntToStr($sMonth, $iLocale, $iMode)
			ElseIf Not StringInStr($sRetFormat, 'mmm') Then
				$sMonth = _DateMonthStrToInt($sMonth)
			EndIf
			
			$sRet = StringReplace($sRetFormat, 'dd', StringFormat('%.2i', $sDay), $iReplaceCount)
			
			If @extended = 0 Then
				$sRet = StringReplace($sRet, 'd', StringFormat('%.1i', $sDay), $iReplaceCount)
			EndIf
			
			$sRet = StringRegExpReplace($sRet, '(?i)mmm~?', $sMonth, $iReplaceCount)
			
			If @extended = 0 Then
				$sRet = StringReplace($sRet, 'mm', StringFormat('%.2i', $sMonth), $iReplaceCount)
				
				If @extended = 0 Then
					$sRet = StringReplace($sRet, 'm', StringFormat('%.1i', $sMonth), $iReplaceCount)
				EndIf
			EndIf
			
			$sRet = StringReplace($sRet, 'yyyy', $sYear, $iReplaceCount)
			
			If @extended = 0 Then
				$sRet = StringReplace($sRet, 'yy', StringRight($sYear, 2), $iReplaceCount)
			EndIf
			
			Return $sRet
	EndSwitch
	
	Return SetError(1, 0, $sDate)
EndFunc

Func _DateMonthIntToStr($iMonth, $iLocale = 0, $iRetMode = 0)
	Local $aMonthNumber_En[13] = ["", "january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"]
	Local $aMonthNumber_Ru[13] = ["", "январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"]
	Local $aMonthNumber_Ru_Mod[13] = ["", "января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"]
	
	If Not StringIsInt($iMonth) Or $iMonth < 1 Or $iMonth > 12 Then
		Return SetError(1, 0, $iMonth)
	EndIf
	
	Switch $iLocale
		Case 1
			If $iRetMode = 1 Then
				Return StringUpper(StringLeft($aMonthNumber_Ru_Mod[$iMonth], 1)) & StringMid($aMonthNumber_Ru_Mod[$iMonth], 2)
			Else
				Return StringUpper(StringLeft($aMonthNumber_Ru[$iMonth], 1)) & StringMid($aMonthNumber_Ru[$iMonth], 2)
			EndIf
		Case Else
			Return StringUpper(StringLeft($aMonthNumber_En[$iMonth], 1)) & StringMid($aMonthNumber_En[$iMonth], 2)
	EndSwitch
EndFunc

Func _DateMonthStrToInt($sMonth)
	Local $aMonths_En = StringSplit('january|february|march|april|may|june|july|august|september|october|november|december', '|')
	Local $aMonths_En_Shrt = StringSplit('jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec', '|')
	
	For $i = 1 To $aMonths_En[0]
		If $sMonth = $aMonths_En[$i] Then
			Return StringFormat('%.2i', $i)
		EndIf
	Next
	
	For $i = 1 To $aMonths_En_Shrt[0]
		If $sMonth = $aMonths_En_Shrt[$i] Then
			Return StringFormat('%.2i', $i)
		EndIf
	Next
	
	Local $aMonths_Ru = StringSplit('январь|февраль|март|апрель|май|июнь|июль|август|сентябрь|октябрь|ноябрь|декабрь', '|')
	Local $aMonths_Ru_Shrt = StringSplit('янв|февр|март|апр|май|июнь|июль|авг.|сент|окт|нояб|дек', '|')
	Local $aMonths_Ru_Mod = StringSplit('января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря', '|')
	
	For $i = 1 To $aMonths_Ru[0]
		If $sMonth = $aMonths_Ru[$i] Then
			Return StringFormat('%.2i', $i)
		EndIf
	Next
	
	For $i = 1 To $aMonths_Ru_Shrt[0]
		If $sMonth = $aMonths_Ru_Shrt[$i] Then
			Return StringFormat('%.2i', $i)
		EndIf
	Next
	
	For $i = 1 To $aMonths_Ru_Mod[0]
		If $sMonth = $aMonths_Ru_Mod[$i] Then
			Return StringFormat('%.2i', $i)
		EndIf
	Next
	
	Return SetError(1, 0, $sMonth)
EndFunc
 
Автор
S

Sverx

Новичок
Сообщения
5
Репутация
0
CreatoR сказал(а):
Код:
$sDate = _Date_Formate('21/12/2015', 'dd mmm~ yyyy г.', 1)
MsgBox(0, @ScriptName, $sDate)
...
[spoiler]
Func _Date_Formate($sDate, $sRetFormat = -1, $iLocale = 0, $iReplaceCount = 1)
	Local $sDelims_Pattern, $sDay_Pattern, $sMonth_Pattern, $sYear_Pattern, $sSearch_Pattern, $sDay, $sMonth, $sYear, $iMode
	
	$sDelims_Pattern = '[\Q /\.,\E]+'
	$sDay_Pattern = '(\d{1,2})'
	$sMonth_Pattern = '(\d{1,2}|[январьфелмтпйиюгусбокд]{3,8}|[decmbrnovtspaugjlyihf]{3,9})'
	$sYear_Pattern = '(\d{4})\h?(?:г\.)?'
	
	$sSearch_Pattern = '(?i)' & $sDay_Pattern & $sDelims_Pattern & $sMonth_Pattern & $sDelims_Pattern & $sYear_Pattern
	
	Switch $sRetFormat
		Case -1, Default
			Return StringRegExp($sDate, $sSearch_Pattern, 3)
		Case Else
			$sDay = StringRegExpReplace($sDate, $sSearch_Pattern, '\1')
			$sMonth = StringRegExpReplace($sDate, $sSearch_Pattern, '\2')
			$sYear = StringRegExpReplace($sDate, $sSearch_Pattern, '\3')
			
			If StringIsDigit($sMonth) And Not StringRegExp($sRetFormat, '(?i)[^m]mm?[^m]') Then
				$iMode = 0
				
				If StringInStr($sRetFormat, 'mmm~') Then ;Needs to be expanded - for our reach russian language :)
					$iMode = 1
				EndIf
				
				$sMonth = _DateMonthIntToStr($sMonth, $iLocale, $iMode)
			ElseIf Not StringInStr($sRetFormat, 'mmm') Then
				$sMonth = _DateMonthStrToInt($sMonth)
			EndIf
			
			$sRet = StringReplace($sRetFormat, 'dd', StringFormat('%.2i', $sDay), $iReplaceCount)
			
			If @extended = 0 Then
				$sRet = StringReplace($sRet, 'd', StringFormat('%.1i', $sDay), $iReplaceCount)
			EndIf
			
			$sRet = StringRegExpReplace($sRet, '(?i)mmm~?', $sMonth, $iReplaceCount)
			
			If @extended = 0 Then
				$sRet = StringReplace($sRet, 'mm', StringFormat('%.2i', $sMonth), $iReplaceCount)
				
				If @extended = 0 Then
					$sRet = StringReplace($sRet, 'm', StringFormat('%.1i', $sMonth), $iReplaceCount)
				EndIf
			EndIf
			
			$sRet = StringReplace($sRet, 'yyyy', $sYear, $iReplaceCount)
			
			If @extended = 0 Then
				$sRet = StringReplace($sRet, 'yy', StringRight($sYear, 2), $iReplaceCount)
			EndIf
			
			Return $sRet
	EndSwitch
	
	Return SetError(1, 0, $sDate)
EndFunc

Func _DateMonthIntToStr($iMonth, $iLocale = 0, $iRetMode = 0)
	Local $aMonthNumber_En[13] = ["", "january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"]
	Local $aMonthNumber_Ru[13] = ["", "январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"]
	Local $aMonthNumber_Ru_Mod[13] = ["", "января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"]
	
	If Not StringIsInt($iMonth) Or $iMonth < 1 Or $iMonth > 12 Then
		Return SetError(1, 0, $iMonth)
	EndIf
	
	Switch $iLocale
		Case 1
			If $iRetMode = 1 Then
				Return StringUpper(StringLeft($aMonthNumber_Ru_Mod[$iMonth], 1)) & StringMid($aMonthNumber_Ru_Mod[$iMonth], 2)
			Else
				Return StringUpper(StringLeft($aMonthNumber_Ru[$iMonth], 1)) & StringMid($aMonthNumber_Ru[$iMonth], 2)
			EndIf
		Case Else
			Return StringUpper(StringLeft($aMonthNumber_En[$iMonth], 1)) & StringMid($aMonthNumber_En[$iMonth], 2)
	EndSwitch
EndFunc

Func _DateMonthStrToInt($sMonth)
	Local $aMonths_En = StringSplit('january|february|march|april|may|june|july|august|september|october|november|december', '|')
	Local $aMonths_En_Shrt = StringSplit('jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec', '|')
	
	For $i = 1 To $aMonths_En[0]
		If $sMonth = $aMonths_En[$i] Then
			Return StringFormat('%.2i', $i)
		EndIf
	Next
	
	For $i = 1 To $aMonths_En_Shrt[0]
		If $sMonth = $aMonths_En_Shrt[$i] Then
			Return StringFormat('%.2i', $i)
		EndIf
	Next
	
	Local $aMonths_Ru = StringSplit('январь|февраль|март|апрель|май|июнь|июль|август|сентябрь|октябрь|ноябрь|декабрь', '|')
	Local $aMonths_Ru_Shrt = StringSplit('янв|февр|март|апр|май|июнь|июль|авг.|сент|окт|нояб|дек', '|')
	Local $aMonths_Ru_Mod = StringSplit('января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря', '|')
	
	For $i = 1 To $aMonths_Ru[0]
		If $sMonth = $aMonths_Ru[$i] Then
			Return StringFormat('%.2i', $i)
		EndIf
	Next
	
	For $i = 1 To $aMonths_Ru_Shrt[0]
		If $sMonth = $aMonths_Ru_Shrt[$i] Then
			Return StringFormat('%.2i', $i)
		EndIf
	Next
	
	For $i = 1 To $aMonths_Ru_Mod[0]
		If $sMonth = $aMonths_Ru_Mod[$i] Then
			Return StringFormat('%.2i', $i)
		EndIf
	Next
	
	Return SetError(1, 0, $sMonth)
EndFunc

Я то думал тут будет какая нибудь, одна секретная функция :smile:, а такой функции стандартно в AutoIT похоже, что вообще нет ...
Огромное спасибо, все работает как надо :beer:, Всего хорошего вам :smile:
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Есть функция, только возвращает названия месяцев на английском языке :
Код:
_DateToMonth
 
Верх