1

Тема: VBS: Вычисление даты с учетом по дням недели

Добрый день!

Подскажите пожалуйста, требуется вычислить день недели, и отнять от него один день, условие что день не должен попадать на выходные то есть субботу или воскресенье...

Например, если сегодня понедельник то дата должна быть пятницей, если вторник то отнимаем день и получается понедельник...



Dim perem, DateADD, DateEnd            ' Ввели переменную
   DD=Day(Now())      ' Now() - это стандартная функция VBScript даты
    If DD < 10 Then
       DD = "0" & DD   ' Проверка текущей даты и добавление слева нуля
    End If
   MM=Month(Now())
    If MM < 10 Then
       MM="0" & MM    ' Добавление нуля перед числом, если оно меньше 10
    End If
   GG=Year(Now())
            perem1 = DD & "." & MM & "." & GG
            DateEnd = GG & "-" & MM & "-" & DD
            DateAdd = GG & "-" & MM & "-" & DD

как раз DateAdd это есть тот день который надо вычислять...

2

Re: VBS: Вычисление даты с учетом по дням недели

я иак понимаю надо копать в сторону DateDiff?

3

Re: VBS: Вычисление даты с учетом по дням недели

Попробуйте так:

Option Explicit

Dim i
Dim dtPrevWorkDate

For i = #04/01/2013# To #05/01/2013#
    dtPrevWorkDate = GetPrevWorkDate(i)
    WScript.Echo i, WeekdayName(Weekday(i)), vbTab, "--->", dtPrevWorkDate, WeekdayName(Weekday(dtPrevWorkDate))
Next

WScript.Quit 0

Function GetPrevWorkDate(dtDate)
    Dim intDiff
    
    Select Case Weekday(dtDate)
        Case vbMonday
            intDiff = -3
        Case vbTuesday, vbWednesday, vbThursday, vbFriday, vbSaturday
            intDiff = -1
        Case vbSunday
            intDiff = -2
    End Select
    
    GetPrevWorkDate = DateAdd("d", intDiff, dtDate)
End Function
+ Результат
01.04.2013 понедельник      ---> 29.03.2013 пятница
02.04.2013 вторник      ---> 01.04.2013 понедельник
03.04.2013 среда      ---> 02.04.2013 вторник
04.04.2013 четверг      ---> 03.04.2013 среда
05.04.2013 пятница      ---> 04.04.2013 четверг
06.04.2013 суббота      ---> 05.04.2013 пятница
07.04.2013 воскресенье      ---> 05.04.2013 пятница
08.04.2013 понедельник      ---> 05.04.2013 пятница
09.04.2013 вторник      ---> 08.04.2013 понедельник
10.04.2013 среда      ---> 09.04.2013 вторник
11.04.2013 четверг      ---> 10.04.2013 среда
12.04.2013 пятница      ---> 11.04.2013 четверг
13.04.2013 суббота      ---> 12.04.2013 пятница
14.04.2013 воскресенье      ---> 12.04.2013 пятница
15.04.2013 понедельник      ---> 12.04.2013 пятница
16.04.2013 вторник      ---> 15.04.2013 понедельник
17.04.2013 среда      ---> 16.04.2013 вторник
18.04.2013 четверг      ---> 17.04.2013 среда
19.04.2013 пятница      ---> 18.04.2013 четверг
20.04.2013 суббота      ---> 19.04.2013 пятница
21.04.2013 воскресенье      ---> 19.04.2013 пятница
22.04.2013 понедельник      ---> 19.04.2013 пятница
23.04.2013 вторник      ---> 22.04.2013 понедельник
24.04.2013 среда      ---> 23.04.2013 вторник
25.04.2013 четверг      ---> 24.04.2013 среда
26.04.2013 пятница      ---> 25.04.2013 четверг
27.04.2013 суббота      ---> 26.04.2013 пятница
28.04.2013 воскресенье      ---> 26.04.2013 пятница
29.04.2013 понедельник      ---> 26.04.2013 пятница
30.04.2013 вторник      ---> 29.04.2013 понедельник
01.05.2013 среда      ---> 30.04.2013 вторник

4 (изменено: Rom5, 2013-06-06 18:10:22)

Re: VBS: Вычисление даты с учетом по дням недели


' dtNow = Now()
dtNow = now() + 4 'для теста перепрыгнем на неск.дней вперд'

weekDayNow = WeekDay(dtNow) 'номер дня недели сейчас: 1 - Вс, 2- Пн, ... 7 - Сб'

Select Case weekDayNow
    Case 1 ' Вс'
        diffDay = -2
    Case 2 ' Пн'
        diffDay = -3
    Case Else
        diffDay = -1
End Select

' MsgBox weekDayNow,, "weekDayNow"

dtPrev = DateAdd("w", diffDay, dtNow)

MsgBox "Определен день - " & (dtPrev) & vbCrLf &_
    "День недели полученной даты: " & WeekdayName( WeekDay(dtPrev) )  & vbCrLf  & vbCrLf &_
    "Стартовая дата - " & (dtNow) & vbCrLf &_
    "День недели стартовой даты: " & WeekdayName( WeekDay(dtNow) )   & vbCrLf &_
    "Разница: " & CStr(diffDay),,""

ps. о, продублировал чутьли не буква в букву)

WBR. Roman

5

Re: VBS: Вычисление даты с учетом по дням недели

Однострочная функция («dtDate» — значение даты) :

DateAdd("d", Array(Array(vbSunday, -2), Array(vbMonday, -3), Array(vbTuesday, -1), Array(vbWednesday, -1), Array(vbThursday, -1), Array(vbFriday, -1), Array(vbSaturday, -1))(Weekday(dtDate) - 1)(1), dtDate)
Rom5 пишет:

ps. о, продублировал чутьли не буква в букву)

Значит, движемся в одном направлении .

6

Re: VBS: Вычисление даты с учетом по дням недели

alexii
номера дней недели - избыточная информация и читабельности не прибавляет.


DateAdd("d", _
    Array(-2, -3, -1, -1, -1, -1, -1)(Weekday(dtDate) - 1), _
    dtDate)
( 2 * b ) || ! ( 2 * b )

7

Re: VBS: Вычисление даты с учетом по дням недели

Спасибо Rom5 и alexii все работает!!!

У меня вопрос к Rom5 как в скрипте убрать время? а то формат лишнее часы секунды и миллисекунды

8 (изменено: Rom5, 2013-06-10 18:53:22)

Re: VBS: Вычисление даты с учетом по дням недели

Можно, например, простейшим усечением строки до первых 10ти символов:

msgbox Left(now(),10),, "Left(now(),10)"

А можно и форматированием через "FormatDateTime(dateOrTime, format)":

msgbox FormatDateTime(now(), 1),, "FormatDateTime(now(), 1)"
msgbox FormatDateTime(now(), 2),, "FormatDateTime(now(), 2)"

' The format parameter can take a value from 0 - 4, each value signifying a different type of formatting:

' 0 (used for dates) - display a date in the format mm/dd/yy (default)
' 1 (used for dates) - display a date in the format day, month and month day, year
' 2 (used for dates) - display a date in the format mm/dd/yy (default (same as 0))
' 3 (used for time) - display time in the format hh:mm:ss: PM/AM (12 hour format)
' 4 (used for time) - display time in the format hh:mm (24 hour format)

WBR. Roman

9

Re: VBS: Вычисление даты с учетом по дням недели

Rom5 пишет:
xsanekk пишет:

У меня вопрос к Rom5 как в скрипте убрать время? а то формат лишнее часы секунды и миллисекунды

Можно, например, простейшим усечением строки до первых 10ти символов:

Использовать «Date()» вместо «Now()» .

Rom5 пишет:

А можно и форматированием через "FormatDateTime(dateOrTime, format)":

У меня несколько по другому:

The NamedFormat argument has the following settings:

vbGeneralDate    0    Display a date and/or time. If there is a date part, display it as a short date. If there is a time part, display it as a long time. If present, both parts are displayed.
vbLongDate    1    Display a date using the long date format specified in your computer's regional settings.
vbShortDate    2    Display a date using the short date format specified in your computer's regional settings.
vbLongTime    3    Display a time using the time format specified in your computer's regional settings.
vbShortTime    4    Display a time using the 24-hour format (hh:mm).