Расчет даты в 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()
(среди прочих).