Làm cách nào để có được số tuần hiện tại trong năm, như của PHP date('W')
?
Nó phải là số tuần ISO-8601 của năm, tuần bắt đầu vào thứ Hai.
Làm cách nào để có được số tuần hiện tại trong năm, như của PHP date('W')
?
Nó phải là số tuần ISO-8601 của năm, tuần bắt đầu vào thứ Hai.
Câu trả lời:
Bạn sẽ có thể có được những gì bạn muốn ở đây: http://www.merlyn.demon.co.uk/js-date6.htm#YWD .
Một liên kết tốt hơn trên cùng một trang là: Làm việc với nhiều tuần .
Dưới đây là một số mã dựa trên các liên kết được cung cấp và tai nghe được đăng bởi Dommer. Nó đã được thử nghiệm nhẹ so với kết quả tại http://www.merlyn.demon.co.uk/js-date6.htm#YWD . Vui lòng kiểm tra kỹ lưỡng, không có đảm bảo cung cấp.
Có một vấn đề với ngày trong khoảng thời gian mà việc tiết kiệm ánh sáng ban ngày được quan sát và những năm mà ngày 1 tháng 1 là thứ Sáu. Đã sửa bằng cách sử dụng tất cả các phương pháp UTC. Sau đây trả về kết quả giống hệt với Moment.js.
/* For a given date, get the ISO week number
*
* Based on information at:
*
* http://www.merlyn.demon.co.uk/weekcalc.htm#WNR
*
* Algorithm is to find nearest thursday, it's year
* is the year of the week number. Then get weeks
* between that date and the first day of that year.
*
* Note that dates in one year can be weeks of previous
* or next year, overlap is up to 3 days.
*
* e.g. 2014/12/29 is Monday in week 1 of 2015
* 2012/1/1 is Sunday in week 52 of 2011
*/
function getWeekNumber(d) {
// Copy date so don't modify original
d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));
// Set to nearest Thursday: current date + 4 - current day number
// Make Sunday's day number 7
d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay()||7));
// Get first day of year
var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
// Calculate full weeks to nearest Thursday
var weekNo = Math.ceil(( ( (d - yearStart) / 86400000) + 1)/7);
// Return array of year and week number
return [d.getUTCFullYear(), weekNo];
}
var result = getWeekNumber(new Date());
document.write('It\'s currently week ' + result[1] + ' of ' + result[0]);
Giờ là 0 khi tạo ngày "UTC".
Thu nhỏ, phiên bản nguyên mẫu (chỉ trả về số tuần):
Date.prototype.getWeekNumber = function(){
var d = new Date(Date.UTC(this.getFullYear(), this.getMonth(), this.getDate()));
var dayNum = d.getUTCDay() || 7;
d.setUTCDate(d.getUTCDate() + 4 - dayNum);
var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
return Math.ceil((((d - yearStart) / 86400000) + 1)/7)
};
document.write('The current ISO week number is ' + new Date().getWeekNumber());
Trong phần này, bạn có thể nhập bất kỳ ngày nào ở định dạng YYYY-MM-DD và kiểm tra xem mã này có cùng số tuần với số tuần ISO của ISO.js (được thử nghiệm trong hơn 50 năm từ 2000 đến 2050).
Date.prototype.getWeekNumber = function(){
var d = new Date(Date.UTC(this.getFullYear(), this.getMonth(), this.getDate()));
var dayNum = d.getUTCDay() || 7;
d.setUTCDate(d.getUTCDate() + 4 - dayNum);
var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
return Math.ceil((((d - yearStart) / 86400000) + 1)/7)
};
function checkWeek() {
var s = document.getElementById('dString').value;
var m = moment(s, 'YYYY-MM-DD');
document.getElementById('momentWeek').value = m.format('W');
document.getElementById('answerWeek').value = m.toDate().getWeekNumber();
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
Enter date YYYY-MM-DD: <input id="dString" value="2021-02-22">
<button onclick="checkWeek(this)">Check week number</button><br>
Moment: <input id="momentWeek" readonly><br>
Answer: <input id="answerWeek" readonly>
d.setMilliseconds(0)
vào - nó tiếp tục hiển thị các số tuần khác nhau cho cùng một ngày tùy thuộc vào việc tôi đã sử dụng Ngày mới () hay Ngày mới ("1/4/2016"). Chỉ cần một cái đầu cho những người khác có thể trải nghiệm tương tự.
Như đã nói ở trên nhưng không có lớp:
let now = new Date();
let onejan = new Date(now.getFullYear(), 0, 1);
week = Math.ceil( (((now - onejan) / 86400000) + onejan.getDay() + 1) / 7 );
(now.getTime() - onejan.getTime())
để tránh các vấn đề xây dựng.
Chính xác http://javascript.about.com/l Library / blweekyear.htmlm
Date.prototype.getWeek = function() {
var onejan = new Date(this.getFullYear(),0,1);
var millisecsInDay = 86400000;
return Math.ceil((((this - onejan) /millisecsInDay) + onejan.getDay()+1)/7);
};
Date.format()
Thư viện của Jacob Wright thực hiện định dạng ngày theo kiểu date()
chức năng của PHP và hỗ trợ số tuần ISO-8601:
new Date().format('W');
Nó có thể hơi quá mức cho một số tuần, nhưng nó hỗ trợ định dạng kiểu PHP và khá tiện dụng nếu bạn sẽ làm nhiều việc này.
getWeekOfYear: function(date) {
var target = new Date(date.valueOf()),
dayNumber = (date.getUTCDay() + 6) % 7,
firstThursday;
target.setUTCDate(target.getUTCDate() - dayNumber + 3);
firstThursday = target.valueOf();
target.setUTCMonth(0, 1);
if (target.getUTCDay() !== 4) {
target.setUTCMonth(0, 1 + ((4 - target.getUTCDay()) + 7) % 7);
}
return Math.ceil((firstThursday - target) / (7 * 24 * 3600 * 1000)) + 1;
}
Mã sau là độc lập múi giờ (ngày UTC được sử dụng) và hoạt động theo https://en.wikipedia.org/wiki/ISO_8601
Tôi thấy hữu ích lớp SimpleDateFormat của Java SE được mô tả trên đặc tả của Oracle: http://goo.gl/7MbCh5 . Trong trường hợp của tôi trong Google Apps Script, nó hoạt động như thế này:
function getWeekNumber() {
var weekNum = parseInt(Utilities.formatDate(new Date(), "GMT", "w"));
Logger.log(weekNum);
}
Ví dụ: trong macro bảng tính, bạn có thể truy xuất múi giờ thực của tệp:
function getWeekNumber() {
var weekNum = parseInt(Utilities.formatDate(new Date(), SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(), "w"));
Logger.log(weekNum);
}
Điều này thêm phương thức "getWeek" vào Date.prototype, trả về số tuần từ đầu năm. Đối số xác định ngày nào trong tuần để xem xét đầu tiên. Nếu không có đối số nào được thông qua, ngày đầu tiên được giả định vào Chủ nhật.
/**
* Get week number in the year.
* @param {Integer} [weekStart=0] First day of the week. 0-based. 0 for Sunday, 6 for Saturday.
* @return {Integer} 0-based number of week.
*/
Date.prototype.getWeek = function(weekStart) {
var januaryFirst = new Date(this.getFullYear(), 0, 1);
if(weekStart !== undefined && (typeof weekStart !== 'number' || weekStart % 1 !== 0 || weekStart < 0 || weekStart > 6)) {
throw new Error('Wrong argument. Must be an integer between 0 and 6.');
}
weekStart = weekStart || 0;
return Math.floor((((this - januaryFirst) / 86400000) + januaryFirst.getDay() - weekStart) / 7);
};
new Date(Date.UTC(2018,11, 31)).getWeek(1)+1
(Thứ Hai là ngày đầu tiên của Đức).
Lấy số tuần của bất kỳ ngày nào
function week(year,month,day) {
function serial(days) { return 86400000*days; }
function dateserial(year,month,day) { return (new Date(year,month-1,day).valueOf()); }
function weekday(date) { return (new Date(date)).getDay()+1; }
function yearserial(date) { return (new Date(date)).getFullYear(); }
var date = year instanceof Date ? year.valueOf() : typeof year === "string" ? new Date(year).valueOf() : dateserial(year,month,day),
date2 = dateserial(yearserial(date - serial(weekday(date-serial(1))) + serial(4)),1,3);
return ~~((date - date2 + serial(weekday(date2) + 5))/ serial(7));
}
console.log(
week(2016, 06, 11),//23
week(2015, 9, 26),//39
week(2016, 1, 1),//53
week(2016, 1, 4),//1
week(new Date(2016, 0, 4)),//1
week("11 january 2016")//2
);
I need the week to begin on a Sunday
; Tôi nghĩ rằng sự thay đổi cần thiết duy nhất là trong chức năng của ngày trong tuần () .getDay()+1
sẽ được thay đổi thành.getDay()
Mã dưới đây tính toán số tuần ISO 8601 chính xác. Nó phù hợp với PHP date("W")
cho mỗi tuần trong khoảng thời gian từ 1/1/1970 đến 1/1/2100.
/**
* 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 1st
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 week number is the number of weeks between the first Thursday of the year
// and the Thursday in the target week (604800000 = 7 * 24 * 3600 * 1000)
return 1 + Math.ceil((firstThursday - target) / 604800000);
}
Nguồn: Taco van den Broek
Nếu bạn không mở rộng các nguyên mẫu, thì đây là một chức năng:
function getWeek(date) {
if (!(date instanceof Date)) date = new Date();
// ISO week date weeks start on Monday, so correct the day number
var nDay = (date.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
date.setDate(date.getDate() - nDay + 3);
// Store the millisecond value of the target date
var n1stThursday = date.valueOf();
// Set the target to the first Thursday of the year
// First, set the target to January 1st
date.setMonth(0, 1);
// Not a Thursday? Correct the date to the next Thursday
if (date.getDay() !== 4) {
date.setMonth(0, 1 + ((4 - date.getDay()) + 7) % 7);
}
// The week number is the number of weeks between the first Thursday of the year
// and the Thursday in the target week (604800000 = 7 * 24 * 3600 * 1000)
return 1 + Math.ceil((n1stThursday - date) / 604800000);
}
Sử dụng mẫu:
getWeek(); // Returns 37 (or whatever the current week is)
getWeek(new Date('Jan 2, 2011')); // Returns 52
getWeek(new Date('Jan 1, 2016')); // Returns 53
getWeek(new Date('Jan 4, 2016')); // Returns 1
+6 ) % 7
phần này. Cảm ơn từ một chà!
Nếu bạn đã ở trong một dự án Angular, bạn có thể sử dụng $filter('date')
.
Ví dụ:
var myDate = new Date();
var myWeek = $filter('date')(myDate, 'ww');
Đoạn mã hoạt động khá tốt đối với tôi là đoạn mã này:
var yearStart = +new Date(d.getFullYear(), 0, 1);
var today = +new Date(d.getFullYear(),d.getMonth(),d.getDate());
var dayOfYear = ((today - yearStart + 1) / 86400000);
return Math.ceil(dayOfYear / 7).toString();
Lưu ý:
d
là Ngày của tôi mà tôi muốn số tuần hiện tại.
Việc +
chuyển đổi Ngày thành số (làm việc với TypeScript).
Đây là cách triển khai của tôi để tính số tuần trong JavaScript. sửa chữa cho thời gian nghỉ hè và mùa đông là tốt. Tôi đã sử dụng định nghĩa của tuần từ bài viết này: ISO 8601
Tuần là từ thứ hai đến chủ nhật, và ngày 4 tháng 1 luôn luôn trong tuần đầu tiên của năm.
// add get week prototype functions
// weeks always start from monday to sunday
// january 4th is always in the first week of the year
Date.prototype.getWeek = function () {
year = this.getFullYear();
var currentDotw = this.getWeekDay();
if (this.getMonth() == 11 && this.getDate() - currentDotw > 28) {
// if true, the week is part of next year
return this.getWeekForYear(year + 1);
}
if (this.getMonth() == 0 && this.getDate() + 6 - currentDotw < 4) {
// if true, the week is part of previous year
return this.getWeekForYear(year - 1);
}
return this.getWeekForYear(year);
}
// returns a zero based day, where monday = 0
// all weeks start with monday
Date.prototype.getWeekDay = function () {
return (this.getDay() + 6) % 7;
}
// corrected for summer/winter time
Date.prototype.getWeekForYear = function (year) {
var currentDotw = this.getWeekDay();
var fourjan = new Date(year, 0, 4);
var firstDotw = fourjan.getWeekDay();
var dayTotal = this.getDaysDifferenceCorrected(fourjan) // the difference in days between the two dates.
// correct for the days of the week
dayTotal += firstDotw; // the difference between the current date and the first monday of the first week,
dayTotal -= currentDotw; // the difference between the first monday and the current week's monday
// day total should be a multiple of 7 now
var weeknumber = dayTotal / 7 + 1; // add one since it gives a zero based week number.
return weeknumber;
}
// corrected for timezones and offset
Date.prototype.getDaysDifferenceCorrected = function (other) {
var millisecondsDifference = (this - other);
// correct for offset difference. offsets are in minutes, the difference is in milliseconds
millisecondsDifference += (other.getTimezoneOffset()- this.getTimezoneOffset()) * 60000;
// return day total. 1 day is 86400000 milliseconds, floor the value to return only full days
return Math.floor(millisecondsDifference / 86400000);
}
để thử nghiệm tôi đã sử dụng các thử nghiệm JavaScript sau trong Qunit
var runweekcompare = function(result, expected) {
equal(result, expected,'Week nr expected value: ' + expected + ' Actual value: ' + result);
}
test('first week number test', function () {
expect(5);
var temp = new Date(2016, 0, 4); // is the monday of the first week of the year
runweekcompare(temp.getWeek(), 1);
var temp = new Date(2016, 0, 4, 23, 50); // is the monday of the first week of the year
runweekcompare(temp.getWeek(), 1);
var temp = new Date(2016, 0, 10, 23, 50); // is the sunday of the first week of the year
runweekcompare(temp.getWeek(), 1);
var temp = new Date(2016, 0, 11, 23, 50); // is the second week of the year
runweekcompare(temp.getWeek(), 2);
var temp = new Date(2016, 1, 29, 23, 50); // is the 9th week of the year
runweekcompare(temp.getWeek(), 9);
});
test('first day is part of last years last week', function () {
expect(2);
var temp = new Date(2016, 0, 1, 23, 50); // is the first last week of the previous year
runweekcompare(temp.getWeek(), 53);
var temp = new Date(2011, 0, 2, 23, 50); // is the first last week of the previous year
runweekcompare(temp.getWeek(), 52);
});
test('last day is part of next years first week', function () {
var temp = new Date(2013, 11, 30); // is part of the first week of 2014
runweekcompare(temp.getWeek(), 1);
});
test('summer winter time change', function () {
expect(2);
var temp = new Date(2000, 2, 26);
runweekcompare(temp.getWeek(), 12);
var temp = new Date(2000, 2, 27);
runweekcompare(temp.getWeek(), 13);
});
test('full 20 year test', function () {
//expect(20 * 12 * 28 * 2);
for (i = 2000; i < 2020; i++) {
for (month = 0; month < 12; month++) {
for (day = 1; day < 29 ; day++) {
var temp = new Date(i, month, day);
var expectedweek = temp.getWeek();
var temp2 = new Date(i, month, day, 23, 50);
var resultweek = temp.getWeek();
equal(expectedweek, Math.round(expectedweek), 'week number whole number expected ' + Math.round(expectedweek) + ' resulted week nr ' + expectedweek);
equal(resultweek, expectedweek, 'Week nr expected value: ' + expectedweek + ' Actual value: ' + resultweek + ' for year ' + i + ' month ' + month + ' day ' + day);
}
}
}
});
Điều số tuần này đã là một nỗi đau thực sự trong một **. Hầu hết các kịch bản trên mạng không làm việc cho tôi. Họ làm việc hầu hết thời gian nhưng tất cả đều bị hỏng ở một số điểm, đặc biệt là khi năm thay đổi và tuần trước của năm đột nhiên vào tuần đầu tiên, v.v. Ngay cả bộ lọc ngày của Angular cho thấy dữ liệu không chính xác (đó là tuần đầu tiên của năm tới, góc cạnh đã cho tuần 53).
Lưu ý: Ví dụ được thiết kế để hoạt động với các tuần ở Châu Âu (Thứ nhất trước tiên)!
nhận được ()
Date.prototype.getWeek = function(){
// current week's Thursday
var curWeek = new Date(this.getTime());
curWeek.setDay(4);
// Get year's first week's Thursday
var firstWeek = new Date(curWeek.getFullYear(), 0, 4);
firstWeek.setDay(4);
return (curWeek.getDayIndex() - firstWeek.getDayIndex()) / 7 + 1;
};
setDay ()
/**
* Make a setDay() prototype for Date
* Sets week day for the date
*/
Date.prototype.setDay = function(day){
// Get day and make Sunday to 7
var weekDay = this.getDay() || 7;
var distance = day - weekDay;
this.setDate(this.getDate() + distance);
return this;
}
getDay Index ()
/*
* Returns index of given date (from Jan 1st)
*/
Date.prototype.getDayIndex = function(){
var start = new Date(this.getFullYear(), 0, 0);
var diff = this - start;
var oneDay = 86400000;
return Math.floor(diff / oneDay);
};
Tôi đã thử nghiệm điều này và nó dường như đang hoạt động rất tốt nhưng nếu bạn nhận thấy một lỗ hổng trong nó, xin vui lòng cho tôi biết.
Tôi đã cố gắng rất nhiều để có được mã ngắn nhất để có được sự tuân thủ ISO hàng tuần.
Date.prototype.getWeek=function(){
var date=new Date(this);
date.setHours(0,0,0,0);
return Math.round(((date.setDate(this.getDate()+2-(this.getDay()||7))-date.setMonth(0,4))/8.64e7+3+(date.getDay()||7))/7)+"/"+date.getFullYear();}
Các biến date
là cần thiết để tránh để thay đổi bản gốc this
. Tôi đã sử dụng các giá trị trả về setDate()
và setMonth()
để phân phối getTime()
để tiết kiệm độ dài mã và tôi đã sử dụng một số cấp số trong một phần nghìn giây của một ngày thay vì nhân các phần tử đơn lẻ hoặc một số có năm số không. this
là Ngày hoặc Số mili giây, giá trị trả về là String
"49/2017".
Với Luxon ( https://github.com/moment/luxon ):
import { DateTime } from 'luxon';
const week: number = DateTime.fromJSDate(new Date()).weekNumber;
Một tùy chọn dựa trên thư viện: sử dụng d3-time-format
:
const formatter = d3.timeFormat('%U');
const weekNum = formatter(new Date());
Cách giải quyết ngắn nhất cho Angular2 + DatePipe, được điều chỉnh cho ISO-8601:
import {DatePipe} from "@angular/common";
public rightWeekNum: number = 0;
constructor(private datePipe: DatePipe) { }
calcWeekOfTheYear(dateInput: Date) {
let falseWeekNum = parseInt(this.datePipe.transform(dateInput, 'ww'));
this.rightWeekNum = falseWeekNum ? falseWeekNum : falseWeekNum-1;
}
now = new Date();
today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
firstOfYear = new Date(now.getFullYear(), 0, 1);
numOfWeek = Math.ceil((((today - firstOfYear) / 86400000)-1)/7);