Показать номер недели с Javascript? - PullRequest
30 голосов
/ 14 октября 2011

У меня есть следующий код, который используется для отображения названия текущего дня, за которым следует заданная фраза.

<script type="text/javascript"> 
    <!-- 
    // Array of day names
    var dayNames = new Array(
    "It's Sunday, the weekend is nearly over",
    "Yay! Another Monday",
     "Hello Tuesday, at least you're not Monday",
     "It's Wednesday. Halfway through the week already",
     "It's Thursday.",
     "It's Friday - Hurray for the weekend",
    "Saturday Night Fever");
    var now = new Date();
    document.write(dayNames[now.getDay()] + ".");
     // -->
</script>

Я хотел бы, чтобы номер текущей недели был в скобках послефраза.Я нашел следующий код:

Date.prototype.getWeek = function() {
    var onejan = new Date(this.getFullYear(),0,1);
    return Math.ceil((((this - onejan) / 86400000) + onejan.getDay()+1)/7);
} 

, который был взят из http://javascript.about.com/library/blweekyear.htm, но я не знаю, как добавить его в существующий код JavaScript.

Ответы [ 13 ]

51 голосов
/ 14 октября 2011

Просто добавьте его к вашему текущему коду, затем наберите (new Date()).getWeek()

<script>
    Date.prototype.getWeek = function() {
        var onejan = new Date(this.getFullYear(), 0, 1);
        return Math.ceil((((this - onejan) / 86400000) + onejan.getDay() + 1) / 7);
    }

    var weekNumber = (new Date()).getWeek();

    var dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
    var now = new Date();
    document.write(dayNames[now.getDay()] + " (" + weekNumber + ").");
</script>
14 голосов
/ 02 января 2013

Если вы уже используете jquery-ui (в частности, datepicker):

Date.prototype.getWeek = function () { return $.datepicker.iso8601Week(this); }

Использование:

var myDate = new Date();
myDate.getWeek();

Подробнее здесь: UI / Datepicker / iso8601Week

Я понимаю, что это не общее решение, поскольку оно связано с зависимостью. Однако, учитывая популярность jquery-ui, для кого-то это может подойти просто - как и для меня.

13 голосов
/ 20 марта 2012

Подумайте об использовании моей реализации "Date.prototype.getWeek", подумайте, что точнее, чем другие, которые я видел здесь:)

Date.prototype.getWeek = function(){
    // We have to compare against the first monday of the year not the 01/01
    // 60*60*24*1000 = 86400000
    // 'onejan_next_monday_time' reffers to the miliseconds of the next monday after 01/01

    var day_miliseconds = 86400000,
        onejan = new Date(this.getFullYear(),0,1,0,0,0),
        onejan_day = (onejan.getDay()==0) ? 7 : onejan.getDay(),
        days_for_next_monday = (8-onejan_day),
        onejan_next_monday_time = onejan.getTime() + (days_for_next_monday * day_miliseconds),
        // If one jan is not a monday, get the first monday of the year
        first_monday_year_time = (onejan_day>1) ? onejan_next_monday_time : onejan.getTime(),
        this_date = new Date(this.getFullYear(), this.getMonth(),this.getDate(),0,0,0),// This at 00:00:00
        this_time = this_date.getTime(),
        days_from_first_monday = Math.round(((this_time - first_monday_year_time) / day_miliseconds));

    var first_monday_year = new Date(first_monday_year_time);

    // We add 1 to "days_from_first_monday" because if "days_from_first_monday" is *7,
    // then 7/7 = 1, and as we are 7 days from first monday,
    // we should be in week number 2 instead of week number 1 (7/7=1)
    // We consider week number as 52 when "days_from_first_monday" is lower than 0,
    // that means the actual week started before the first monday so that means we are on the firsts
    // days of the year (ex: we are on Friday 01/01, then "days_from_first_monday"=-3,
    // so friday 01/01 is part of week number 52 from past year)
    // "days_from_first_monday<=364" because (364+1)/7 == 52, if we are on day 365, then (365+1)/7 >= 52 (Math.ceil(366/7)=53) and thats wrong

    return (days_from_first_monday>=0 && days_from_first_monday<364) ? Math.ceil((days_from_first_monday+1)/7) : 52;
}

Вы можете проверить мое публичное репо здесь https://bitbucket.org/agustinhaller/date.getweek (включая тесты)

6 голосов
/ 20 апреля 2016

Если вы хотите что-то работающее и ориентированное на будущее, используйте такую ​​библиотеку, как MomentJS.

moment(date).week();
moment(date).isoWeek()

http://momentjs.com/docs/#/get-set/week/

6 голосов
/ 17 декабря 2015

Похоже, эта функция, которую я нашел на weeknumber.net , довольно точна и проста в использовании.

// This script is released to the public domain and may be used, modified and
// distributed without restrictions. Attribution not necessary but appreciated.
// Source: http://weeknumber.net/how-to/javascript 

// Returns the ISO week of the date.
Date.prototype.getWeek = function() {
  var date = new Date(this.getTime());
  date.setHours(0, 0, 0, 0);
  // Thursday in current week decides the year.
  date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);
  // January 4 is always in week 1.
  var week1 = new Date(date.getFullYear(), 0, 4);
  // Adjust to Thursday in week 1 and count number of weeks from date to week1.
  return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7);
}

Если вам повезет, как мне, и вам нужно найти неделюномер месяца, который немного отрегулирует, сделает это:

// Returns the week in the month of the date.
Date.prototype.getWeekOfMonth = function() {
  var date = new Date(this.getTime());
  date.setHours(0, 0, 0, 0);
  // Thursday in current week decides the year.
  date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);
  // January 4 is always in week 1.
  var week1 = new Date(date.getFullYear(), date.getMonth(), 4);
  // Adjust to Thursday in week 1 and count number of weeks from date to week1.
  return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7);
}
3 голосов
/ 09 мая 2012

Все предложенные подходы могут давать неправильные результаты, поскольку они не учитывают изменения летнего / зимнего времени. Вместо того, чтобы вычислять количество дней между двумя датами с использованием константы 86-400000 миллисекунд, лучше использовать подход, подобный следующему:

getDaysDiff = function (dateObject0, dateObject1) {
    if (dateObject0 >= dateObject1) return 0;
    var d = new Date(dateObject0.getTime());
    var nd = 0;
    while (d <= dateObject1) {
        d.setDate(d.getDate() + 1);
        nd++;
    }
    return nd-1;
};
3 голосов
/ 14 октября 2011

Добавляя фрагмент, вы расширяете объект Date.

Date.prototype.getWeek = function() {
    var onejan = new Date(this.getFullYear(),0,1);
    return Math.ceil((((this - onejan) / 86400000) + onejan.getDay()+1)/7);
}

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

2 голосов
/ 07 апреля 2016

Если вы уже используете Angular, вы можете получить прибыль $filter('date').

Например:

var myDate = new Date();
var myWeek = $filter('date')(myDate, 'ww');
1 голос
/ 14 октября 2011

С этим кодом вы можете просто;

document.write(dayNames[now.getDay()] + " (" + now.getWeek() + ").");

(Вам нужно вставить функцию getWeek над текущим скриптом)

0 голосов
/ 30 августа 2017

Я кодировал в темноте (вызов) и не мог найти или протестировать свой код.

Я забыл, как называется округление (Math.celi), поэтому я хотел быть уверен, что понял все правильно и придумал этот код.

var elm = document.createElement('input')
elm.type = 'week'
elm.valueAsDate = new Date()
var week = elm.value.split('W').pop()

console.log(week)
Просто доказательство того, как вы можете получить неделю любым другим способом

Но все же я рекомендую любое другое решение, которое не требуется DOM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...