Moment: التقريب لأقرب فترة 15 دقيقة.

تم إنشاؤها على ٢٧ يوليو ٢٠١٣  ·  18تعليقات  ·  مصدر: moment/moment

كنت أتساءل عما إذا كان هناك طريقة لتقريب لأعلى أو لأسفل لأقرب فاصل زمني مدته 15 دقيقة. أعتقد أن هذه ستكون ميزة رائعة في الوقت الحالي لأن بعض الليبس مثل datejs لديهم هذه الوظيفة مما رأيته عند البحث. السيناريو الخاص بي هو أن لدي نقاط بيانات مقسمة إلى مجموعات مدتها 15 دقيقة ، وتقوم أداة التحديد بإرجاع أي كتلة زمنية وأحتاج إلى التقريب إلى أقرب 15 دقيقة وتقريبها لأعلى في وقت الانتهاء.

يبدو أن القيام بذلك بهذه الطريقة (http://stackoverflow.com/questions/4968250/how-to-round-time-to-the-nearest-quarter-hour-in-javascript) سيكون بمثابة ألم .. عندما سيكون من المفيد أن يكون في lib نفسه.

todo

التعليق الأكثر فائدة

لا داعي للتعقيد ، الرياضيات البسيطة:

const rounded = Math.round(moment().minute() / 15) * 15;
const roundedDown = Math.floor(moment().minute() / 15) * 15;
const roundedUp = Math.ceil(moment().minute() / 15) * 15;

moment().minute(roundedUp).second(0)

المخرجات لأقرب ربع 15 دقيقة.

ال 18 كومينتر

moment.fn.roundMinutes = function () { return ~(this.minutes() / 15) * 15; }

لقد صنعت هذا لاستخدامي الخاص واعتقدت أنه قد يساعد الآخرين. ضع في اعتبارك أنه يتم التقريب إلى أقرب 15 دقيقة تالية.

moment.fn.roundNext15Min = function () {
var intervals = Math.floor(this.minutes() / 15);
if(this.minutes() % 15 != 0)
    intervals++;
    if(intervals == 4) {
        this.add('hours', 1);
        intervals = 0;
    }
    this.minutes(intervals * 15);
    this.seconds(0);
    return this;
}

EDIT: أزل this.incrementHours () لصالح this.add ('Hours'، 1)؛

هل يمكنك من فضلك إضافة هذه الوظائف للحظة .. سيكون من الرائع حقًا أن تكون قادرًا على التقريب إلى أقرب الفترات الزمنية التالية والتالية والسابقة ... هناك الملايين من نتائج google لهذا الغرض ومئات من التصويتات الإضافية للتكدس ..

الآن بعد أن نظرت إليها مرة أخرى ليس لدي أي فكرة عن كيفية عمل incrementHours.
لقد قمت بتحرير رسالتي لمشكلة الرمز المصحح. يتمتع!

يوم الإثنين ، 10 آذار (مارس) 2014 الساعة 2:29 مساءً ، بليك نيميجسكي
إخطاراتgithub.com

ماذا كانت وظيفتك لزيادة الساعات؟ أظن أن ذلك حدث أيضًا في الأيام
جدا.

قم بالرد على هذه الرسالة الإلكترونية مباشرة أو tHubhttps: //github.com/moment/moment/issues/959#issuecomment -37223821
.

شكرا لهذه الطريقة zbarnett . بالضبط ما احتاجه لمشروعي

حسنًا ، يمكننا استخدام واجهة startOf مثل هذا startOf(15, 'm') . يمكن أن تعمل لجميع الوحدات. في انتظار PRs :)

إليك صيغة بسيطة جدًا (في صيغة Coffeescript ، نظرًا لأن هذا هو السياق الذي واجهت فيه هذه المشكلة):

round_interval = 15
remainder = time.minute() % round_interval
time.subtract('minutes', remainder).add('minutes', if remainder > round_interval / 2 then round_interval else 0)

أنا مشغول بما فيه الكفاية بأشياء أخرى في الوقت الحالي ، ولكن إذا أراد شخص ما أخذ هذا الرمز ووضعه مباشرة في العلاقات العامة ، فلا تتردد.

إغلاق لصالح # 1595

لا داعي للتعقيد ، الرياضيات البسيطة:

const rounded = Math.round(moment().minute() / 15) * 15;
const roundedDown = Math.floor(moment().minute() / 15) * 15;
const roundedUp = Math.ceil(moment().minute() / 15) * 15;

moment().minute(roundedUp).second(0)

المخرجات لأقرب ربع 15 دقيقة.

لم أتمكن من الحصول على حل janwerkhoven للعمل ، لذلك هذا حل لي:

function round15(minute) {
  let intervals = [15, 30, 45, 59, 0];
  let closest;
  let min = 90;

  for (let i = 0; i < intervals.length; i++) {
    let iv = intervals[i];
    let maybeMin = Math.abs(minute - iv);

    if (maybeMin < min) {
      min = maybeMin;
      closest = iv;
    }
  }

  if (closest === 59) {
    closest = 0;
  }

  return closest;
}

let myMoment = moment();
myMoment.minutes(round15(myMoment.minutes()));

تضمين التغريدة

function nearestMinutes(interval, someMoment){
  const roundedMinutes = Math.round(someMoment.clone().minute() / interval) * interval;
  return someMoment.clone().minute(roundedMinutes).second(0);
}

function nearestPastMinutes(interval, someMoment){
  const roundedMinutes = Math.floor(someMoment.minute() / interval) * interval;
  return someMoment.clone().minute(roundedMinutes).second(0);
}

function nearestFutureMinutes(interval, someMoment){
  const roundedMinutes = Math.ceil(someMoment.minute() / interval) * interval;
  return someMoment.clone().minute(roundedMinutes).second(0);
}

const now = moment();
const nearest5min = nearestMinutes(5, now);
const nearest15min = nearestMinutes(15, now);
const nearest30min = nearestMinutes(30, now);
const nearestFuture5min = nearestFutureMinutes(5, now);
const nearestPast5min = nearestPastMinutes(5, now);

تم اختباره على Code Pen

الجزء الحاسم هو عمل .clone() . بدونها ، ستتمكن من تحرير moment() الأصلي وهو أمر شائع عند استخدام Moment.js.

جرب هؤلاء الرجال

time = moment("01:46", "HH:mm");
round_interval = 30;//15;
intervals = Math.floor(time.minutes() / round_interval);
minutesToRound = time.minutes() % round_interval;
minutesRounded = minutesToRound>round_interval/2 ? round_interval: 0;
minutes = intervals * round_interval + minutesRounded;
time.minutes(minutes);

alert(time.format("HH:mm"))

في وقت متأخر من الحفلة ، أعلم ، ولكن ...

وظيفةjanwerkhoven nearestMinutes غير صحيحة ؛ هذا يعني أنه سيتم تقريبه لأعلى أو لأسفل حسب الدقيقة ، لذلك بالتقريب إلى أقرب 15 نتوقع 12:34 -> 12:30 و 12:39 -> 12:45

const roundedMinutes = Math.round(someMoment.clone().minute() / interval) * interval;

// 12:34 is fine...
// => Math.round(34 / 15) * 15
// => 2 * 15
30

// ... but 12:39 is not - it should be 45
// => Math.round(39 / 15) * 15
// => 2 * 15
30

حل Silviusconcept يتغلب على هذا بـ minutesRounded

تضمين التغريدة
إرجاع Math.round(39/15) 3 وليس 2.
إرجاع Math.round(39/15) * 15 45 وليس 30.

هاها هذا ما أحصل عليه لقراءة الكثير من المواضيع في نهاية اليوم عندما لم أنم .. كنت أفعل Math.floor

أنا أحب _zbarnett solution_ ! سهل الاستخدام
تحديث بسيط للدالة _

var newdate = turno.date.clone (). roundNext15Min (). add (توقع ، 'minutes') ؛

moment.fn.roundNext15Min = وظيفة () {
فترات var = Math.floor (this.minutes () / 15) ؛
إذا (this.minutes ()٪ 15! = 0)
فترات ++ ؛
إذا (فترات == 4) {
this.add ('ساعات'، 1)؛
فترات = 0 ؛
}
this.minutes (فترات * 15) ؛
this.seconds (0) ؛
_ this.milliseconds (0) ؛ _
إعادة هذا ؛
}

نسختى من الجواب

const startOf = (m, n, unit) => {
  const units = [
    'year',
    'month',
    'hour',
    'minute',
    'second',
    'millisecond',
  ];
  const pos = units.indexOf(unit);
  if (pos === -1) {
    throw new Error('Unsupported unit');
  }
  for (let i = pos + 1; i < units.length; i++) {
    m.set(units[i], 0);
  }
  m.set(unit, Math.floor(m.get(unit) / n) * n);

  return m;
};

const endOf = (m, n, unit) => {
  const units = [
    'year',
    'month',
    'hour',
    'minute',
    'second',
    'millisecond',
  ];
  const pos = units.indexOf(unit);
  if (pos === -1) {
    throw new Error('Unsupported unit');
  }
  for (let i = pos + 1; i < units.length; i++) {
    m.set(units[i], units[i] === 'millisecond' ? 999 : 59);
  }
  m.set(unit, Math.floor(m.get(unit) / n) * n + n - 1);

  return m;
};

استخدم مثل هذا:

startOf(moment(), 15, 'minute');
endOf(moment(), 15, 'minute')
// with moment-timezone
startOf(moment().tz("Europe/London"), 15, 'minute');

ستغير هذه الوظائف الكائن الأصلي ، استخدم clone() عند الحاجة

حل آخر سيكون:
let next15Minutes = moment().add(15, 'minutes'); next15Minutes.minutes(Math.floor(next15Minutes.minutes() / 15) * 15); next15Minutes.format('HH:mm');

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات