2016-08-20 2 views
1

Я пишу AppleScript, который каждый месяц создает электронную таблицу MS Excel. Мне нужно знать, сколько дней в текущем месяце, а затем пройти через все месяцы и решить, является ли данный день рабочим днем ​​или праздником.Получите последний день в месяц в AppleScript и праздники в текущем месяце

Я полагаю, что я бы сэкономил праздничные дни (из этой сети http://kalendar365.cz/statni-svatky/2016 в качестве таблицы и получить доступ к ним локально).

Мой вопрос:

  1. Как получить последний день в течение месяца?
  2. Как эффективно выполнять петлю через все дни текущего месяца и решать, будет ли это воскресенье, суббота или день, указанные где-то в другом месте (например, в текстовом файле таблицы xlsx)?
+0

В vanilla AppleScript вы можете получить последний день текущего месяца следующим образом: 1) установить переменную в 'current date' 2) Установить для свойства' day' этой даты значение 32, чтобы вызвать переполнение. Это устанавливает дату в первый день следующего месяца. 3) Вычтите один день. – vadian

+0

Не было бы проще позволить excel вычислить это? Существует встроенная функция ['NETWORKDAYS'] (https://support.office.com/en-us/article/NETWORKDAYS-function-48e717bf-a7a3-495f-969e-5005e3eb18e7), которая будет делать все это в одном step ... –

+0

@vadian: Это не так, как это работает (по крайней мере, на OS 10.8+): вставьте следующие 3 оператора в редактор сценариев и запустите их, и вы увидите, что итоговая дата - март _3rd_, а не 1 марта (вам может потребоваться настроить строку даты в соответствии с вашей локалью): 'set aDate to date '1 февраля 2016 г.' ',' установить день aDate до 32', 'aDate'. – mklement0

ответ

0

pbell's answer является перспективным, но функция GetLastDay не работает в течение нескольких месяцев, которые имеют меньше, чем 31 дней; вот функция, которая фиксирует, что:

# Returns the number of days in the month that the given date falls in. 
# Example: 
#  my GetNumberOfDaysInMonth(current date) 
on GetNumberOfDaysInMonth(aDate) 
    local aDateCopy 
    copy aDate to aDateCopy 
    set day of aDateCopy to 1 
    if month of aDateCopy is December then 
     set year of aDateCopy to ((year of aDateCopy) + 1) 
     set month of aDateCopy to 1 
    else 
     set month of aDateCopy to ((month of aDateCopy) + 1) 
    end if 
    return day of (aDateCopy - 1 * days) 
end GetNumberOfDaysInMonth 

Подход основан на установке даты на 1 месяц, затем увеличивающиеся месяц (возможно опрокидывание в следующем году), и вычитая 1 день, который работает правильно со всеми датами, даже в високосные годы.

-1

Скрипт ниже содержит 2 подпрограммы, которые вы ищете: GetlastDay и isWorkingDay:

set myDate to current date -- just for example ! 

set N to GetlastDay(myDate) 
log N --> number of days in month of myDate 
set A to IsWorkingday(myDate) 
log A --> true if Monday to Friday, false if Saturday/Sunday 


on GetlastDay(LDate) -- return last day of month of LDate 
copy LDate to L -- to not change LDate 
set L's day to 32 -- = first day of next month 
set L to L - (1 * days) -- last day of month 
return day of L 
end GetlastDay 

on IsWorkingday(LDate) -- true if date is not Saturday or Sunday 
set SD to weekday of LDate 
return (SD is not in {Saturday, Sunday}) 
end IsWorkingday 
+0

Большое спасибо Вадяну. Да, я обновил свой сценарий, чтобы удалить кавычки. Извините – pbell

+0

Ваша функция «GetlastDay» работает только в течение нескольких месяцев, у которых есть 31 день. – mklement0

Смежные вопросы