用 Javascript 显示周数?

发布于 2024-12-09 13:34:15 字数 951 浏览 0 评论 0原文

我有以下代码,用于显示当天的名称,后跟一组短语。

<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 代码中。

I have the following code that is used to show the name of the current day, followed by a set phrase.

<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>

What I would like to do is have the current week number in brackets after the phrase. I have found the following code:

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

Which was taken from http://javascript.about.com/library/blweekyear.htm but I have no idea how to add it to existing javascript code.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(16

椒妓 2024-12-16 13:34:15

只需将其添加到您当前的代码中,然后调用 (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>

Simply add it to your current code, then call (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>
感受沵的脚步 2024-12-16 13:34:15

如果您已经使用 jQuery-UI(特别是 datepicker):

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

用法:

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

更多信息: UI/Datepicker/iso8601Week

我意识到这不是一个通用的解决方案,因为它会产生依赖性。然而,考虑到 jQuery-UI 的流行,这可能只是适合某些人 - 就像我一样。


如果您不使用 jQuery-UI 并且无意添加依赖项。您只需复制他们的 iso8601Week() 实现,因为它是用纯 JavaScript 编写的,没有复杂的依赖关系:

// Determine the week of the year (local timezone) based on the ISO 8601 definition.
Date.prototype.iso8601Week = function () {
  // Create a copy of the current date, we don't want to mutate the original
  const date = new Date(this.getTime());

  // Find Thursday of this week starting on Monday
  date.setDate(date.getDate() + 4 - (date.getDay() || 7));
  const thursday = date.getTime();

  // Find January 1st
  date.setMonth(0); // January
  date.setDate(1);  // 1st
  const jan1st = date.getTime();

  // Round the amount of days to compensate for daylight saving time
  const days = Math.round((thursday - jan1st) / 86400000); // 1 day = 86400000 ms
  return Math.floor(days / 7) + 1;
};

console.log(new Date().iso8601Week());
console.log(new Date("2020-01-01T00:00").iso8601Week());
console.log(new Date("2021-01-01T00:00").iso8601Week());
console.log(new Date("2022-01-01T00:00").iso8601Week());
console.log(new Date("2023-12-31T00:00").iso8601Week());
console.log(new Date("2024-12-31T00:00").iso8601Week());

In case you already use jQuery-UI (specifically datepicker):

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

Usage:

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

More here: UI/Datepicker/iso8601Week

I realize this isn't a general solution as it incurs a dependency. However, considering the popularity of jQuery-UI this might just be a simple fit for someone - as it was for me.


If you don't use jQuery-UI and have no intention of adding the dependency. You could just copy their iso8601Week() implementation since it is written in pure JavaScript without complex dependencies:

// Determine the week of the year (local timezone) based on the ISO 8601 definition.
Date.prototype.iso8601Week = function () {
  // Create a copy of the current date, we don't want to mutate the original
  const date = new Date(this.getTime());

  // Find Thursday of this week starting on Monday
  date.setDate(date.getDate() + 4 - (date.getDay() || 7));
  const thursday = date.getTime();

  // Find January 1st
  date.setMonth(0); // January
  date.setDate(1);  // 1st
  const jan1st = date.getTime();

  // Round the amount of days to compensate for daylight saving time
  const days = Math.round((thursday - jan1st) / 86400000); // 1 day = 86400000 ms
  return Math.floor(days / 7) + 1;
};

console.log(new Date().iso8601Week());
console.log(new Date("2020-01-01T00:00").iso8601Week());
console.log(new Date("2021-01-01T00:00").iso8601Week());
console.log(new Date("2022-01-01T00:00").iso8601Week());
console.log(new Date("2023-12-31T00:00").iso8601Week());
console.log(new Date("2024-12-31T00:00").iso8601Week());

往事风中埋 2024-12-16 13:34:15

考虑使用我的“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(包括测试)

Consider using my implementation of "Date.prototype.getWeek", think is more accurate than the others i have seen here :)

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;
}

You can check my public repo here https://bitbucket.org/agustinhaller/date.getweek (Tests included)

我不是你的备胎 2024-12-16 13:34:15

如果您想要一些可行且面向未来的东西,请使用像 MomentJS 这样的库。

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

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

If you want something that works and is future-proof, use a library like MomentJS.

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

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

淤浪 2024-12-16 13:34:15

看起来我在 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() {
  let 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.
  let 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() {
  let 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.
  let 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);
}

It looks like this function I found at weeknumber.net is pretty accurate and easy to use.

// 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() {
  let 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.
  let 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);
}

If you're lucky like me and need to find the week number of the month a little adjust will do it:

// Returns the week in the month of the date.
Date.prototype.getWeekOfMonth = function() {
  let 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.
  let 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);
}
假装爱人 2024-12-16 13:34:15

如果您已经使用 Angular,那么您可以受益 $filter('date')< /代码>

例如:

var myDate = new Date();
var myWeek = $filter('date')(myDate, 'ww');

If you already use Angular, then you could profit $filter('date').

For example:

var myDate = new Date();
var myWeek = $filter('date')(myDate, 'ww');
傾旎 2024-12-16 13:34:15

我在黑暗中编码(一个挑战),无法查找、引入任何依赖项或测试我的代码。

我忘记了叫什么舍入(Math.celi)所以我想额外确定我是否正确并想出了这个代码。

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

console.log(week)

Just a proof of concept of how you can get the week in any other way

但我仍然推荐 DOM 不需要的任何其他解决方案。

I was coding in the dark (a challenge) and couldn't lookup, bring in any dependencies or test my code.

I forgot what round up was called (Math.celi) So I wanted to be extra sure i got it right and came up with this code instead.

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

console.log(week)

Just a proof of concept of how you can get the week in any other way

But still i recommend any other solution that isn't required by the DOM.

情话墙 2024-12-16 13:34:15

通过添加代码片段,您可以扩展 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() 方法的脚本。

By adding the snippet you extend the Date object.

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

If you want to use this in multiple pages you can add this to a seperate js file which must be loaded first before your other scripts executes. With other scripts I mean the scripts which uses the getWeek() method.

秉烛思 2024-12-16 13:34:15

所有提出的方法可能会给出错误的结果,因为它们没有考虑夏季/冬季时间的变化。与其使用 86'400'000 毫秒常数来计算两个日期之间的天数,不如使用如下方法:

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;
};

All the proposed approaches may give wrong results because they don’t take into account summer/winter time changes. Rather than calculating the number of days between two dates using the constant of 86’400’000 milliseconds, it is better to use an approach like the following one:

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;
};
堇色安年 2024-12-16 13:34:15

在支持 week 输入类型的浏览器中,以下函数应该可以工作:

function isoWeek(date) {
  const input = document.createElement('input');
  input.type = 'week';
  input.valueAsDate = date;
  return input.value;
};

Cf.

>>> isoWeek(new Date("2022-01-01"))
'2021-W52'
>>> isoWeek(new Date("2022-01-03"))
'2022-W01'
>>> isoWeek(new Date("2023-12-14"))
'2023-W50'
>>> isoWeek(new Date("2024-01-01"))
'2024-W01'

In browsers that support the week input type, the following function should work:

function isoWeek(date) {
  const input = document.createElement('input');
  input.type = 'week';
  input.valueAsDate = date;
  return input.value;
};

Cf.

>>> isoWeek(new Date("2022-01-01"))
'2021-W52'
>>> isoWeek(new Date("2022-01-03"))
'2022-W01'
>>> isoWeek(new Date("2023-12-14"))
'2023-W50'
>>> isoWeek(new Date("2024-01-01"))
'2024-W01'
一个人的旅程 2024-12-16 13:34:15

使用该代码,您可以简单地;

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

(您需要将 getWeek 函数粘贴到当前脚本上方)

With that code you can simply;

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

(You will need to paste the getWeek function above your current script)

妳是的陽光 2024-12-16 13:34:15

你会发现这个小提琴很有用。刚刚完成。
https://jsfiddle.net/dnviti/ogpt920w/
下面还有代码:

/** 
 * Get the ISO week date week number 
 */  
Date.prototype.getWeek = function () {  
  // Create a copy of this date object  
  var target  = new Date(this.valueOf());  

  // ISO week date weeks start on monday  
  // so correct the day number  
  var dayNr   = (this.getDay() + 6) % 7;  

  // ISO 8601 states that week 1 is the week  
  // with the first thursday of that year.  
  // Set the target date to the thursday in the target week  
  target.setDate(target.getDate() - dayNr + 3);  

  // Store the millisecond value of the target date  
  var firstThursday = target.valueOf();  

  // Set the target to the first thursday of the year  
  // First set the target to january first  
  target.setMonth(0, 1);  
  // Not a thursday? Correct the date to the next thursday  
  if (target.getDay() != 4) {  
    target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7);  
  }  

  // The weeknumber is the number of weeks between the   
  // first thursday of the year and the thursday in the target week  
  return 1 + Math.ceil((firstThursday - target) / 604800000); // 604800000 = 7 * 24 * 3600 * 1000  
}  

/** 
* Get the ISO week date year number 
*/  
Date.prototype.getWeekYear = function ()   
{  
  // Create a new date object for the thursday of this week  
  var target  = new Date(this.valueOf());  
  target.setDate(target.getDate() - ((this.getDay() + 6) % 7) + 3);  

  return target.getFullYear();  
}

/** 
 * Convert ISO week number and year into date (first day of week)
 */ 
var getDateFromISOWeek = function(w, y) {
  var simple = new Date(y, 0, 1 + (w - 1) * 7);
  var dow = simple.getDay();
  var ISOweekStart = simple;
  if (dow <= 4)
    ISOweekStart.setDate(simple.getDate() - simple.getDay() + 1);
  else
    ISOweekStart.setDate(simple.getDate() + 8 - simple.getDay());
  return ISOweekStart;
}

var printDate = function(){
  /*var dateString = document.getElementById("date").value;
	var dateArray = dateString.split("/");*/ // use this if you have year-week in the same field

  var dateInput = document.getElementById("date").value;
  if (dateInput == ""){
    var date = new Date(); // get today date object
  }
  else{
    var date = new Date(dateInput); // get date from field
  }

  var day = ("0" + date.getDate()).slice(-2); // get today day
  var month = ("0" + (date.getMonth() + 1)).slice(-2); // get today month
  var fullDate = date.getFullYear()+"-"+(month)+"-"+(day) ; // get full date
  var year = date.getFullYear();
  var week = ("0" + (date.getWeek())).slice(-2);
  var locale= "it-it";
  
  document.getElementById("date").value = fullDate; // set input field

  document.getElementById("year").value = year;
  document.getElementById("week").value = week; // this prototype has been written above

  var fromISODate = getDateFromISOWeek(week, year);
  
	var fromISODay = ("0" + fromISODate.getDate()).slice(-2);
  var fromISOMonth = ("0" + (fromISODate.getMonth() + 1)).slice(-2);
  var fromISOYear = date.getFullYear();
  
  // Use long to return month like "December" or short for "Dec"
  //var monthComplete = fullDate.toLocaleString(locale, { month: "long" }); 

  var formattedDate = fromISODay + "-" + fromISOMonth + "-" + fromISOYear;

  var element = document.getElementById("fullDate");

  element.value = formattedDate;
}

printDate();
document.getElementById("convertToDate").addEventListener("click", printDate);
*{
  font-family: consolas
}
<label for="date">Date</label>
<input type="date" name="date" id="date" style="width:130px;text-align:center" value="" />
<br /><br />
<label for="year">Year</label>
<input type="year" name="year" id="year" style="width:40px;text-align:center" value="" />
-
<label for="week">Week</label>
<input type="text" id="week" style="width:25px;text-align:center" value="" />
<br /><br />
<label for="fullDate">Full Date</label>
<input type="text" id="fullDate" name="fullDate" style="width:80px;text-align:center" value="" />
<br /><br />
<button id="convertToDate">
Convert Date
</button>

这是纯JS。
里面有很多日期函数,可以让您将日期转换为周数,反之亦然:)

You could find this fiddle useful. Just finished.
https://jsfiddle.net/dnviti/ogpt920w/
Code below also:

/** 
 * Get the ISO week date week number 
 */  
Date.prototype.getWeek = function () {  
  // Create a copy of this date object  
  var target  = new Date(this.valueOf());  

  // ISO week date weeks start on monday  
  // so correct the day number  
  var dayNr   = (this.getDay() + 6) % 7;  

  // ISO 8601 states that week 1 is the week  
  // with the first thursday of that year.  
  // Set the target date to the thursday in the target week  
  target.setDate(target.getDate() - dayNr + 3);  

  // Store the millisecond value of the target date  
  var firstThursday = target.valueOf();  

  // Set the target to the first thursday of the year  
  // First set the target to january first  
  target.setMonth(0, 1);  
  // Not a thursday? Correct the date to the next thursday  
  if (target.getDay() != 4) {  
    target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7);  
  }  

  // The weeknumber is the number of weeks between the   
  // first thursday of the year and the thursday in the target week  
  return 1 + Math.ceil((firstThursday - target) / 604800000); // 604800000 = 7 * 24 * 3600 * 1000  
}  

/** 
* Get the ISO week date year number 
*/  
Date.prototype.getWeekYear = function ()   
{  
  // Create a new date object for the thursday of this week  
  var target  = new Date(this.valueOf());  
  target.setDate(target.getDate() - ((this.getDay() + 6) % 7) + 3);  

  return target.getFullYear();  
}

/** 
 * Convert ISO week number and year into date (first day of week)
 */ 
var getDateFromISOWeek = function(w, y) {
  var simple = new Date(y, 0, 1 + (w - 1) * 7);
  var dow = simple.getDay();
  var ISOweekStart = simple;
  if (dow <= 4)
    ISOweekStart.setDate(simple.getDate() - simple.getDay() + 1);
  else
    ISOweekStart.setDate(simple.getDate() + 8 - simple.getDay());
  return ISOweekStart;
}

var printDate = function(){
  /*var dateString = document.getElementById("date").value;
	var dateArray = dateString.split("/");*/ // use this if you have year-week in the same field

  var dateInput = document.getElementById("date").value;
  if (dateInput == ""){
    var date = new Date(); // get today date object
  }
  else{
    var date = new Date(dateInput); // get date from field
  }

  var day = ("0" + date.getDate()).slice(-2); // get today day
  var month = ("0" + (date.getMonth() + 1)).slice(-2); // get today month
  var fullDate = date.getFullYear()+"-"+(month)+"-"+(day) ; // get full date
  var year = date.getFullYear();
  var week = ("0" + (date.getWeek())).slice(-2);
  var locale= "it-it";
  
  document.getElementById("date").value = fullDate; // set input field

  document.getElementById("year").value = year;
  document.getElementById("week").value = week; // this prototype has been written above

  var fromISODate = getDateFromISOWeek(week, year);
  
	var fromISODay = ("0" + fromISODate.getDate()).slice(-2);
  var fromISOMonth = ("0" + (fromISODate.getMonth() + 1)).slice(-2);
  var fromISOYear = date.getFullYear();
  
  // Use long to return month like "December" or short for "Dec"
  //var monthComplete = fullDate.toLocaleString(locale, { month: "long" }); 

  var formattedDate = fromISODay + "-" + fromISOMonth + "-" + fromISOYear;

  var element = document.getElementById("fullDate");

  element.value = formattedDate;
}

printDate();
document.getElementById("convertToDate").addEventListener("click", printDate);
*{
  font-family: consolas
}
<label for="date">Date</label>
<input type="date" name="date" id="date" style="width:130px;text-align:center" value="" />
<br /><br />
<label for="year">Year</label>
<input type="year" name="year" id="year" style="width:40px;text-align:center" value="" />
-
<label for="week">Week</label>
<input type="text" id="week" style="width:25px;text-align:center" value="" />
<br /><br />
<label for="fullDate">Full Date</label>
<input type="text" id="fullDate" name="fullDate" style="width:80px;text-align:center" value="" />
<br /><br />
<button id="convertToDate">
Convert Date
</button>

It's pure JS.
There are a bunch of date functions inside that allow you to convert date into week number and viceversa :)

无人接听 2024-12-16 13:34:15

Luxon 是另一种选择。 Luxon 日期对象有一个 weekNumber 属性:

let week = luxon.DateTime.fromString("2022-04-01", "yyyy-MM-dd").weekNumber;
console.log(week);
<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/3.0.1/luxon.min.js"></script>

Luxon is an other alternative. Luxon date objects have a weekNumber property:

let week = luxon.DateTime.fromString("2022-04-01", "yyyy-MM-dd").weekNumber;
console.log(week);
<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/3.0.1/luxon.min.js"></script>

痴意少年 2024-12-16 13:34:15

我已经尝试使用上面所有答案中的代码,并且全部返回一月第一周的第 52 周。所以我决定自己写一个,它可以正确计算周数。
周计数从 0 开始

也许使用循环的品味不好,或者可以将结果缓存在某处,以防止在调用函数足够频繁的情况下重复相同的计算。好吧,我为自己做了这个,它做了我需要它做的事情。

    Date.prototype.getWeek = function() {
       // debugger
        let msWeek = 604800000;                                     // Week in milliseconds
        let msDay = 86400000;                                       // Day in milliseconds
        let year = this.getFullYear();                              // Get the year
        //let month = this.getMonth();                                // Month
        let oneDate = new Date(year, 0, 1);                         // Create a new date based on THIS year
        let temp = oneDate.getDay();                                // Ordinal of the first day
        let getFirstDay = (temp === 0) ? 6 : temp - 1;              // Ordinal of the first day of the current month (0-MO, 6-SU)
        let countWeek  = 0;
        // Test to confirm week
        oneDate = new Date(oneDate.getTime() + msDay*(7 - getFirstDay));
        if(oneDate.getTime() > this.getTime()){
            return  countWeek;
        }
        // Increment loop
        while(true){
            oneDate = new Date(oneDate.getTime() + msWeek);                 // Add a week and check
            if(oneDate.getTime() > this.getTime()) break;
            countWeek++;
        }
        return countWeek + 1;
    }

    let s1 = new Date('2022-01-01'); console.log(s1.getWeek());
    let s2 = new Date('2023-01-01'); console.log(s2.getWeek());
    let s22 = new Date('2023-01-02'); console.log(s22.getWeek());
    let s3 = new Date('2024-01-01'); console.log(s3.getWeek());
    let s4 = new Date('2025-01-01'); console.log(s4.getWeek());
    let s5 = new Date('2022-02-28'); console.log(s5.getWeek());
    let s6 = new Date('2022-12-31'); console.log(s6.getWeek());
    let s7 = new Date('2024-12-31'); console.log(s7.getWeek());

I've tried using code from all of the answers above, and all return week #52 for the first of January. So I decided to write my own, which calculates the week number correctly.
Week numeration starts from 0

Maybe it's a bad taste to use a loop, or the result can be cached somewhere to prevent repeating the same calculations if the function is called often enough. Well, I have made this for myself, and it does what I need it to do.

    Date.prototype.getWeek = function() {
       // debugger
        let msWeek = 604800000;                                     // Week in milliseconds
        let msDay = 86400000;                                       // Day in milliseconds
        let year = this.getFullYear();                              // Get the year
        //let month = this.getMonth();                                // Month
        let oneDate = new Date(year, 0, 1);                         // Create a new date based on THIS year
        let temp = oneDate.getDay();                                // Ordinal of the first day
        let getFirstDay = (temp === 0) ? 6 : temp - 1;              // Ordinal of the first day of the current month (0-MO, 6-SU)
        let countWeek  = 0;
        // Test to confirm week
        oneDate = new Date(oneDate.getTime() + msDay*(7 - getFirstDay));
        if(oneDate.getTime() > this.getTime()){
            return  countWeek;
        }
        // Increment loop
        while(true){
            oneDate = new Date(oneDate.getTime() + msWeek);                 // Add a week and check
            if(oneDate.getTime() > this.getTime()) break;
            countWeek++;
        }
        return countWeek + 1;
    }

    let s1 = new Date('2022-01-01'); console.log(s1.getWeek());
    let s2 = new Date('2023-01-01'); console.log(s2.getWeek());
    let s22 = new Date('2023-01-02'); console.log(s22.getWeek());
    let s3 = new Date('2024-01-01'); console.log(s3.getWeek());
    let s4 = new Date('2025-01-01'); console.log(s4.getWeek());
    let s5 = new Date('2022-02-28'); console.log(s5.getWeek());
    let s6 = new Date('2022-12-31'); console.log(s6.getWeek());
    let s7 = new Date('2024-12-31'); console.log(s7.getWeek());

一指流沙 2024-12-16 13:34:15

我在这里看到的一些代码在像 2016 年这样的年份失败,其中第 53 周跳到第 2 周。

这是一个修订后的工作版本:

Date.prototype.getWeek = function() { 

  // Create a copy of this date object  
  var target  = new Date(this.valueOf());  

  // ISO week date weeks start on monday, so correct the day number  
  var dayNr   = (this.getDay() + 6) % 7;  

  // Set the target to the thursday of this week so the  
  // target date is in the right year  
  target.setDate(target.getDate() - dayNr + 3);  

  // ISO 8601 states that week 1 is the week with january 4th in it  
  var jan4    = new Date(target.getFullYear(), 0, 4);  

  // Number of days between target date and january 4th  
  var dayDiff = (target - jan4) / 86400000;    

  if(new Date(target.getFullYear(), 0, 1).getDay() < 5) {
    // Calculate week number: Week 1 (january 4th) plus the    
    // number of weeks between target date and january 4th    
    return 1 + Math.ceil(dayDiff / 7);    
  }
  else {  // jan 4th is on the next week (so next week is week 1)
    return Math.ceil(dayDiff / 7); 
  }
}; 

Some of the code I see in here fails with years like 2016, in which week 53 jumps to week 2.

Here is a revised and working version:

Date.prototype.getWeek = function() { 

  // Create a copy of this date object  
  var target  = new Date(this.valueOf());  

  // ISO week date weeks start on monday, so correct the day number  
  var dayNr   = (this.getDay() + 6) % 7;  

  // Set the target to the thursday of this week so the  
  // target date is in the right year  
  target.setDate(target.getDate() - dayNr + 3);  

  // ISO 8601 states that week 1 is the week with january 4th in it  
  var jan4    = new Date(target.getFullYear(), 0, 4);  

  // Number of days between target date and january 4th  
  var dayDiff = (target - jan4) / 86400000;    

  if(new Date(target.getFullYear(), 0, 1).getDay() < 5) {
    // Calculate week number: Week 1 (january 4th) plus the    
    // number of weeks between target date and january 4th    
    return 1 + Math.ceil(dayDiff / 7);    
  }
  else {  // jan 4th is on the next week (so next week is week 1)
    return Math.ceil(dayDiff / 7); 
  }
}; 
兮颜 2024-12-16 13:34:15

Martin Schillinger 的版本似乎是严格正确的版本。

因为我知道我只需要它在工作日正常工作,所以我根据我在网上找到的东西使用了这个更简单的表格,不记得在哪里:

ISOWeekday = (0 == InputDate.getDay()) ? 7 : InputDate.getDay();
ISOCalendarWeek = Math.floor( ( ((InputDate.getTime() - (new Date(InputDate.getFullYear(),0,1)).getTime()) / 86400000) - ISOWeekday + 10) / 7 );

它在一月初失败,属于上一年最后一周的日子(在这些情况下它会产生 CW = 0)但对于其他所有情况都是正确的。

Martin Schillinger's version seems to be the strictly correct one.

Since I knew I only needed it to work correctly on business week days, I went with this simpler form, based on something I found online, don't remember where:

ISOWeekday = (0 == InputDate.getDay()) ? 7 : InputDate.getDay();
ISOCalendarWeek = Math.floor( ( ((InputDate.getTime() - (new Date(InputDate.getFullYear(),0,1)).getTime()) / 86400000) - ISOWeekday + 10) / 7 );

It fails in early January on days that belong to the previous year's last week (it produces CW = 0 in those cases) but is correct for everything else.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文