Что нового

[Время, дата] Вычетание дней месяца

Pavel

Новичок
Сообщения
125
Репутация
3
Встала проблема.
Допустим, есть
Код:
$iDate = '17.09.2011'

Как сделать так, чтобы
Код:
$iDate = $iDate - 18

стало равно 31.08.2011?
А соответственно, '01.01.2011 - 1' стало равно 31.12.2010? :smile:
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Вот:
Код:
#include <Date.au3>

$Date = '17.09.2011' ;Дата
$Days = 18 ;Сколько дней нужно отщитать

$Calc = _CalcDate($Date, $Days)
MsgBox(0, 'Дата', $Calc)

Func _CalcDate($iDate, $iDays)
	Local $Y, $M, $D
	$Split = StringSplit($iDate, '.')
	$Conv = _DateToDayValue($Split[3], $Split[2], $Split[1])
	$Conv = _DayValueToDate($Conv-$iDays, $Y, $M, $D)
	$Format = StringSplit($Conv, '/')
	Return $Format[3] & '.' & $Format[2] & '.' & $Format[1]
EndFunc
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Zaramot
Так - не работает. Один день не вычитает.
Код:
#include <Date.au3>

$Date = '31.12.2011' ;Дата
$Days = 1 ;Сколько дней нужно отсчитать

$Calc = _CalcDate($Date, $Days)
MsgBox(0, 'Дата', $Calc)

Func _CalcDate($iDate, $iDays)
    Local $Y, $M, $D
    $Split = StringSplit($iDate, '.')
    $Conv = _DateToDayValue($Split[3], $Split[2], $Split[1])
    $Conv = _DayValueToDate($Conv-($iDays-1), $Y, $M, $D)
    $Format = StringSplit($Conv, '/')
    Return $Format[3] & '.' & $Format[2] & '.' & $Format[1]
EndFunc
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Yuriy, я только что исправил.

Заменил:
Код:
$Conv = _DayValueToDate($Conv-($iDays-1), $Y, $M, $D)

на
Код:
$Conv = _DayValueToDate($Conv-$iDays, $Y, $M, $D)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
А чем не устраивает стандартная функция _DateAdd() ?
Код:
#include <Date.au3>

For $i = -20 To 20
	ConsoleWrite($i & @TAB &  _DateTimeFormat(_DateAdd('d', $i, _NowCalcDate()), 2) & @LF)
Next
 

WinDos32

Новичок
Сообщения
13
Репутация
0
все в принципе понятно, но подскажите плз, как высчитать последний день месяца от какой-нить даты
к примеру на sql это можно сделать так select dateadd(mm,1,дата)-day(дата).
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
WinDos32,
Ты точнее вопросы ставь, а то непонятно какая дата тебе нужна.

То ли
Код:
#include <Date.au3>
Local $Y, $M, $D
$Conv = _DateToDayValue (@YEAR, @MON, 1)
$Conv = _DayValueToDate($Conv-1, $Y, $M, $D)
MsgBox(0, 'Дата', $Conv)


то ли
Код:
#include <Date.au3>
Local $Y, $M, $D
$Conv = _DateToDayValue (@YEAR, @MON+1, 1)
$Conv = _DayValueToDate($Conv-1, $Y, $M, $D)
MsgBox(0, 'Дата', $Conv)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
WinDos32,
Можно так.
Код:
ConsoleWrite(StringFormat('%02d.%04d\tLast day: %d\n', @MON, @YEAR, _LastDayInMonth()) & @LF)

For $j = @YEAR To @YEAR + 10
	For $i = 1 To 13
		$iDays = _LastDayInMonth($j, $i)
		If @error Then
			ConsoleWrite('Error' & @LF)
		Else
			ConsoleWrite(StringFormat('%02d.%04d\tLast day: %d\n', $i, $j, $iDays))
		EndIf
	Next
Next

; измененные _DaysInMonth() и _DateIsLeapYear() из Date.au3
Func _LastDayInMonth($i_Year = @YEAR, $i_Mon = @MON)
	Local $ai_Days[13] = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
	$i_Year = Abs(Int($i_Year))
	If $i_Year < 1000 Or $i_Year > 2999 Then Return SetError(1, 0, 0)
	$i_Mon = Abs(Int($i_Mon))
	If $i_Mon < 1 Or $i_Mon > 12 Then Return SetError(1, 0, 0)
	If (Not Mod($i_Year, 4) And Mod($i_Year, 100)) Or (Not Mod($i_Year, 400)) Then $ai_Days[2] = 29
	Return $ai_Days[$i_Mon]
EndFunc   ;==>_LastDayInMonth
 
Верх