Haftaya Pazartesi günü isoWeekday () ile başlamak


117

Haftaları tablo biçiminde yazdırdığım bir takvim oluşturuyorum. Bir şart, bazı kullanıcı seçeneklerine göre haftalara Pazartesi veya Pazar günü başlayabilmemdir. Anları kullanmakta zorlanıyorumMomentin isoWeekday yöntemini zorlanıyorum .

// Start of some date range. Can be any day of the week.
var startOfPeriod = moment("2013-06-23T00:00:00"),

    // We begin on the start of the first week.
    // Mon Tues Wed Thur Fri Sat Sun
    // 20  21   22  23   24  25  26
    begin = moment(startOfPeriod).isoWeekday(1); // will pull from user setting

console.log(begin.isoWeekday()); // 1 - all good

// Let's get the beginning of this first week, respecting the isoWeekday
begin.startOf('week');

console.log(begin.isoWeekday()); // 7 - what happened ???

// Get column headers
for (var i=0; i<7; i++) {
    console.log(begin.format('ddd')); // I want Monday first!
    begin.add('d', 1);
}

jsFiddle

EDIT Gerçekte ne isoWeekdayyaptığını yanlış anladım . "Haftanın hangi günü haftanın ilk günü" değişkenini (var olmayan) ayarladığını düşündüm. Aslında yaptığı şey, tıpkı haftanın gününü değiştirmektir moment.weekday(), ancak 0-6 yerine 1-7 aralığını kullanır.

Yanıtlar:


247

begin.startOf('isoWeek');yerine kullanmayı denebegin.startOf('week');


10
startOf('week')Sizin durumunuzda Pazar gününün haftanın başlangıcını işaret ettiği mevcut yerel ayara bağlıdır. startOf('iweek')Pazartesi olan haftanın ISO başlangıcını alacak. Ama haklısın, resmi sitede herhangi bir belge bulamadım ...
devnull69

15
Moment.js'nin mevcut sürümü kullanıyor isoweek.
savinger

2
@ Kaydedicinin yorumuna ve güncel belgelere göre düzenlendi :)
Matchu

20
isoWeek, en son sürümde büyük
harf

8

13

Çağrı startOfönce isoWeekday.

var begin = moment(date).startOf('week').isoWeekday(1);

Çalışma demosu


1
Bu düzgün çalışmıyor. Bugünün tarihi olan 2016-09-05 için, haftanın başlangıç ​​tarihi olarak 2016-08-29'u döndürür, bu doğru değildir, çünkü bugün Pazartesi'dir (iso hafta). uygun cevap zaten kabul edildi.
undefinedman

9

Bu şekilde haftanın ilk gününü ayarlayabilirsiniz.

moment.locale('en', {
    week: {
        dow: 6
    }
});
moment.locale('en');

moment().weekday(1);Moment.isoWeekday (1) yerine birlikte kullandığınızdan emin olun.


2

Gelecekteki herhangi bir gözetleme için bunu ekleyeceğimi düşündüm. Gerekirse pazartesinin de her zaman pazar gününü garantilemek için kullanılmasını her zaman sağlayacaktır. Benim için her zaman pazartesiye ihtiyacım var, ancak yerel, kullanılan makineye bağlı ve bu kolay bir düzeltme:

var begin = moment().isoWeekday(1).startOf('week');
var begin2 = moment().startOf('week');
// could check to see if day 1 = Sunday  then add 1 day
// my mac on bst still treats day 1 as sunday    

var firstDay = moment().startOf('week').format('dddd') === 'Sunday' ?     
moment().startOf('week').add('d',1).format('dddd DD-MM-YYYY') : 
moment().startOf('week').format('dddd DD-MM-YYYY');

document.body.innerHTML = '<b>could be monday or sunday depending on client: </b><br />' + 
begin.format('dddd DD-MM-YYYY') + 
'<br /><br /> <b>should be monday:</b> <br>' + firstDay + 
'<br><br> <b>could also be sunday or monday </b><br> ' + 
begin2.format('dddd DD-MM-YYYY');

1
olası kısayol momenti (). isoWeekday (1) .startOf ('isoweek']. format ('gggg DD MM YYYY')
davethecoder

2

İşte haftanın herhangi bir günü için daha genel bir çözüm. Jsfiddle üzerinde çalışma demosu

var myIsoWeekDay = 2; // say our weeks start on tuesday, for monday you would type 1, etc.

var startOfPeriod = moment("2013-06-23T00:00:00"),

// how many days do we have to substract?
var daysToSubtract = moment(startOfPeriod).isoWeekday() >= myIsoWeekDay ?
    moment(startOfPeriod).isoWeekday() - myIsoWeekDay :
    7 + moment(startOfPeriod).isoWeekday() - myIsoWeekDay;

// subtract days from start of period
var begin = moment(startOfPeriod).subtract('d', daysToSubtract);

-1

isoWeekVarsayılan olmak isteyenler için anın davranışını şu şekilde değiştirebilirsiniz:

const moment = require('moment');
const proto = Object.getPrototypeOf(moment());

const {startOf, endOf} = proto;
proto.startOf = function(period) {
  if (period === 'week') {
    period = 'isoWeek';
  }
  return startOf.call(this, period);
};
proto.endOf = function(period) {
  if (period === 'week') {
    period = 'isoWeek';
  }
  return endOf.call(this, period);
};

Artık someDate.startOf('week')pazar günü olacak endişelenmeden kullanabilir isoweekveya kullanıp kullanmayacağınızı veyaisoWeek vs.

Ayrıca bunu bir değişken içinde saklayabilir const period = 'week've güvenli bir şekilde subtract()veya add()işlemlerde kullanabilirsiniz, örn moment().subtract(1, period).startOf(period);. Bu, dönem varlığında işe yaramaz isoWeek.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.