Что нового

[Время, дата] Изменить время для программы телепередач (добавить -1, -4, +10 к указанному.)

beve

Осваивающий
Сообщения
104
Репутация
30
Имеется программа телепередач:
0:00 Программма0
0:30 Программма1
1:00 Программма2
1:15 Программма3
1:30 Программма4
2:00 Программма5
2:30 Программма6
3:00 Программма7
3:30 Программма8
4:00 Программма9
4:15 Программма10
4:30 Программма11
5:00 Программма12
5:30 Программма13
6:00 Программма14
7:00 Программма15
7:30 Программма16
8:00 Программма17
8:15 Программма18
8:30 Программма19
9:00 Программма20
9:30 Программма21
10:00 Программма22
10:30 Программма23
11:00 Программма24
11:30 Программма25
12:00 Программма26
12:30 Программма27
13:00 Программма28
13:30 Программма29
14:00 Программма30
14:15 Программма31
14:45 Программма32
15:45 Программма33
16:00 Программма34
17:00 Программма35
17:15 Программма36
17:30 Программма37
18:00 Программма38
19:00 Программма39
19:30 Программма40
20:00 Программма41
20:30 Программма42
21:00 Программма43
21:30 Программма44
21:45 Программма45
22:00 Программма46
22:30 Программма47
23:00 Программма48
23:30 Программма49
Нужно придумать "универсальную" функцию, чтобы можно было в этой программе телепередач изменять время - минус час от текущего (переработка с времени России на Украину), минус 4 часа от текущего и прибавить 10 часов к текущему.
Вот так я сделал для переделки времени на час меньше. По такому же принципу придется сделать и для остальных задач. Но может кто посоветует более универсальное решение, чтобы в одной функции реализовать все и было оптимально?
Код:
#include <Array.au3>
$sData=ClipGet()

$Programma= _ConvertProgramTime($sData, -1)
if @error Then
	MsgBox(48, "Warning", "Произошла ошибка")
	Exit
endif
MsgBox(64,"Message", $Programma)

;$Data=телепрограмма, $Time=нужное время от указанного текущего
Func _ConvertProgramTime($Data, $Time=0)
if $Data="" then Return SetError(1)
$aText=StringRegExp($Data, "\d\d?:\d\d.*", 3)
if IsArray($aText) then 
	For $i=0 to UBound ($aText)-1
		$HourTime=int(StringLeft($aText[$i], 2))
		$NewHourTime=$HourTime+$Time
		$NewHourTime=StringFormat("%02i", $NewHourTime)
		;почему дальше не if, да для этого можно сделать if, но если нужно будет отнимать 4 часа или прибавлять 10, то придется так.
		Switch $NewHourTime
			Case "-1"
				$NewHourTime="23"
		EndSwitch
		for $Hour=0 to 23
			if $HourTime==$Hour then 
				$aText[$i]=StringRegExpReplace($aText[$i],"\d\d?(:\d\d.*)", $NewHourTime & "\1")
			endif
		next
	Next
Else
	Return SetError(2)
EndIf
_ArraySort($aText)
Return _ArrayToString($aText, @lf)
EndFunc

или же другого решения, как только коректировка в этом куске кода нету:
Код:
Switch $NewHourTime
	Case "-1"
		$NewHourTime="23"
EndSwitch
 

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
OffTopic:
мда... лень путь к прогрессу ;)

А тебе это зачем вообще?
завтра утром гляну... спать охота)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
beve,
Код:
#include <Date.au3>
#include <Array.au3>

$aText = StringSplit(StringStripCR(FileRead(@ScriptDir & '\test.txt')), @LF)
_ArrayDisplay($aText)
$hFile = FileOpen(@ScriptDir & '\testNew.txt', 2)
For $i = 1 To $aText[0]
	$sTime = StringRegExpReplace($aText[$i], '\A(\d+:\d+)\s?.*', '\1')
	$aText[$i] = StringReplace($aText[$i], $sTime, _My_Time($sTime, -5))
	If $i <> $aText[0] Then
		FileWrite($hFile, $aText[$i] & @CRLF)
	Else
		FileWrite($hFile, $aText[$i])
	EndIf
Next
FileClose($hFile)
_ArrayDisplay($aText)

Func _My_Time($s_Time, $i_Diff)
	Local $s_NewTime
	$s_Time = _NowCalcDate() & ' ' & $s_Time & ':00'
	$s_NewTime = _DateAdd('h', $i_Diff, $s_Time)
	$s_NewTime = StringRegExpReplace($s_NewTime, '(?s).*?\s(\d+:\d+):00', '\1')
	Return $s_NewTime
EndFunc   ;==>_My_Time
 
Автор
beve

beve

Осваивающий
Сообщения
104
Репутация
30
madmasles, спасибо большое. Как я проглядел функцию _DateAdd(), очень нужная, как чувствовал что есть что то подобное.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
beve
И так, без подключения дополнительных библиотек, вроде, работает:
Код:
;#include <Array.au3>

$iDiff = -5

$aText = StringSplit(StringStripCR(FileRead(@ScriptDir & '\test.txt')), @LF)
;_ArrayDisplay($aText)
$hFile = FileOpen(@ScriptDir & '\testNew.txt', 2)
For $i = 1 To $aText[0]
	$iTime = StringRegExpReplace($aText[$i], '\A(\d+):?.*', '\1')
	$sEndString = StringRegExpReplace($aText[$i], '\A\d+:(.*?)\z', '\1')
	$iTime = $iTime + $iDiff
	If $iTime > 23 Then
		$iTime -= 24
	ElseIf $iTime < 0 Then
		$iTime += 24
	EndIf
	$aText[$i] = StringFormat('%02i:%s', $iTime, $sEndString)
	If $i <> $aText[0] Then
		FileWrite($hFile, $aText[$i] & @CRLF)
	Else
		FileWrite($hFile, $aText[$i])
	EndIf
Next
FileClose($hFile)
;_ArrayDisplay($aText)
 
Автор
beve

beve

Осваивающий
Сообщения
104
Репутация
30
И так, без подключения дополнительных библиотек, вроде, работает
Принимается. Все логично. Спасибо.
 
Верх