Расчет даты в JavaScript

В настоящее время я ищу, чтобы вычислить пользовательскую дату в JavaScript, и моя голова начинает болеть, думая об этом. У меня есть обратный отсчет, который должен начинаться каждый второй вторник в 12 часов. У меня есть функция обратного отсчета, работающая правильно, используя плагин обратного отсчета jQuery Кит Вуд, но нам нужна помощь в расчете каждого другого вторника месяца и с этим reset в этот день.

Вся помощь очень ценится, как всегда.

Thansk заранее

Ответ 1

Мне пришлось сделать что-то подобное (не в JS, но алгоритм достаточно похож)

Теперь, прежде чем я начну, чтобы уточнить, я предполагаю, что это происходит раз в две недели независимо от длины месяца, а не во второй и четвертый вторник независимо от того, когда это произошло, что проще решить

Выберите дату в прошлом, когда это событие произошло (или дату первого вхождения), мы будем называть эту дату base в следующем коде

var base=new Date('date of first occurrence');
var one_day=1000*60*60*24; //length of day in ms

// assume we care about if the countdown should start today 
// this may be different if you are building a calendar etc.
var date_to_check=new Date();

var diff_in_days=math.floor(date_to_check-base)/one_day);
var days_since_last_reset= diff_in_days%14;
if(days_since_last_reset == 0){
    //date_to_check is the same day in the fortnightly cycle as base
    //i.e. today at some point is when you'll want to show the timer
    //If you only want to show the timer between certain times,
    //add another check here
}else{
    //next reset in (14 - days_since_last_reset) days from date_to_check
}

Или версия с кодом для гольфа:

if( Math.floor((new Date()-new Date('date of first occurrence'))/1000/60/60/24)%14 == 0 )
    //reset/start timer

Ответ 2

Подберите Date Library, чтобы получить пользовательские функции даты и времени расчета.

Чтобы использовать его на стороне клиента, загрузите index.js и assertHelper.js и включите его в свой HTML.

<script src="assertHelper.js"></script>
<script type="text/javascript" src="index.js"></script>
$( document ).ready(function() {
    DateLibrary.getDayOfWeek(new Date("2015-06-15"),{operationType:"Day_of_Week"}); // Output : Monday
}

Вы можете использовать различные функции, приведенные в примерах для получения пользовательских дат.

Получить первый день квартала с указанной даты

DateLibrary.getRelativeDate(new Date("2015-06-15"),
    {operationType:"First_Date",granularityType:"Quarters"}) // Output : Wed Apr 01 2015 00:00:00

Если первый день недели - воскресенье, какая дата будет в среду, если  данная дата - 15 июня 2015 года.

DateLibrary.getRelativeDate(iDate,
    {operationType: "Date_of_Weekday_in_Week",
        startDayOfWeek:"Sunday",returnDayOfWeek:"Wednesday"}) // Output : Wed Jun 17 2015 00:00:00

Если первый день недели - пятница, какая дата будет во вторник 3-го  Неделя 2-го месяца третьего квартала года, в которой 15 июня 2015 года  одна из дат.

DateLibrary.getRelativeDate(new Date("2015-06-15"),
    {operationType: "Date_of_Weekday_in_Year_for_Given_Quarter_and_Month_and_Week",
        startDayOfWeek:"Friday",returnDayOfWeek:"Tuesday", QuarterOfYear:3, MonthOfQuarter:2, WeekOfMonth:3}) // Output : 18th Aug 2015

Если первый день недели - вторник, какая неделя в году будет  следуйте 15 июня 2015 года как одну из дат.

 DateLibrary.getWeekNumber(new Date("2015-06-15"),
    {operationType:"Week_of_Year",
        startDayOfWeek:"Tuesday"}) // Output : 24

Доступны функции разницы дат

 DateLibrary.getDateDifference(new Date("2016-04-01"),new Date("2016-04-16"),
    {granularityType: "days"}) //output 15

Функция для преобразования числа в Timestr

DateLibrary.getNumberToTimeStr("345", {delimiter: ":"}) //output 00:03:45

Он также поддерживает преобразование даты в Julian

 DateLibrary.julianToDate("102536") //output Fri Jun 20 2003 00:00:00

Ответ 3

Существует реализация JavaScript правил повторения RFC 2445: http://code.google.com/p/google-caja/source/browse/trunk/src/com/google/caja/demos/calendar/rrule-cajita.js, для чего требуются некоторые файлы в том же каталоге. См. unit test (http://code.google.com/p/google-caja/source/browse/trunk/tests/com/google/caja/demos/calendar/rrule_test.js) для примеров того, как это работает.

Попробуйте использовать его для разбора RRULE: FREQ = WEEKLY; BYDAY = TU; INTERVAL = 2, что означает каждую секунду (из-за интервала) неделю (из-за частоты) во вторник (из-за дня).

Ответ 4

Посмотрите на библиотеку date.js. В нем есть несколько помощников по синтаксическому анализу, включая Date.today().next().tuesday() (среди прочих).