用Javascript显示周数?

dan*_*mcc 30 javascript calendar date

我有以下代码用于显示当天的名称,后跟一个设置短语.

<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>
Run Code Online (Sandbox Code Playgroud)

我想做的是在短语之后的括号中加上当前的周数.我找到了以下代码:

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

这是从http://javascript.about.com/library/blweekyear.htm获取的,但我不知道如何将其添加到现有的JavaScript代码中.

lau*_*ent 51

只需将其添加到当前代码中,然后调用即可 (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>
Run Code Online (Sandbox Code Playgroud)

  • 首先,您必须问自己是否需要相当于[strftime](http://man7.org/linux/man-pages/man3/strftime.3.html)`%U`,`%V`或`%W`.我认为人们通常使用ISO 8601周数('%V`),其中第1周是该年第一个星期四的那一周. (2认同)
  • 这是错误的: `var onejan = new Date(this.getFullYear(), 0, 1)` 这是因为,根据 ISO,一年中的第一周是第一个星期四。或者,换句话说,有 1 月 4 日的那一周。这解决了这个问题: `var onejan = new Date(this.getFullYear(), 0, 4)` 这也意味着 `onejan` 不是该变量的正确名称。 (2认同)

cor*_*lla 14

如果你已经使用jquery-ui(特别是datepicker):

Date.prototype.getWeek = function () { return $.datepicker.iso8601Week(this); }
Run Code Online (Sandbox Code Playgroud)

用法:

var myDate = new Date();
myDate.getWeek();
Run Code Online (Sandbox Code Playgroud)

更多信息: UI/Datepicker/iso8601Week

我意识到这不是一般的解决方案,因为它会产生依赖性.然而,考虑到jquery-ui的流行,这可能只适合某人 - 就像我一样.


Agu*_*ler 13

考虑使用我的"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;
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里查看我的公共回购https://bitbucket.org/agustinhaller/date.getweek(包括测试)

  • 现在它说它是第40周,这是错误的(现在是第41周).不是真的"比其他人更准确"...... (3认同)

Mar*_*ger 6

看起来我在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);
}
Run Code Online (Sandbox Code Playgroud)

如果你像我一样幸运,需要找到一个月的周数,那么可以做一点调整:

// 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);
}
Run Code Online (Sandbox Code Playgroud)


hak*_*nin 6

如果你想要一些有效并且面向未来的东西,可以使用像MomentJS这样的库.

moment(date).week();
moment(date).isoWeek()
Run Code Online (Sandbox Code Playgroud)

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