Moment: Pembulatan ke interval 15 menit terdekat.

Dibuat pada 27 Jul 2013  ·  18Komentar  ·  Sumber: moment/moment

Saya bertanya-tanya apakah ada cara bagi saya untuk membulatkan ke atas atau ke bawah ke interval 15 menit terdekat. Saya pikir ini akan menjadi fitur hebat untuk dimiliki saat ini karena beberapa lib seperti datejs memiliki fungsi ini dari apa yang saya lihat saat mencari. Skenario saya adalah bahwa saya memiliki titik data yang tersegmentasi ke dalam ember 15 menit, Alat pemilihan mengembalikan blok waktu apa pun dan saya perlu membulatkan ke bawah ke 15 menit terdekat dan membulatkan ke atas untuk waktu akhir.

Melakukannya dengan cara ini ( http://stackoverflow.com/questions/4968250/how-to-round-time-to-the-nearest-quarter-hour-in-javascript ) sepertinya akan merepotkan .. akan berguna untuk dimiliki di lib itu sendiri.

todo

Komentar yang paling membantu

Tidak perlu rumit, matematika sederhana:

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)

Keluaran ke kuartal 15 menit terdekat.

Semua 18 komentar

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

Saya membuat ini untuk penggunaan saya sendiri dan berpikir itu dapat membantu orang lain. Perlu diingat itu tidak membulatkan ke 15 menit BERIKUTNYA terdekat.

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: menghapus this.incrementHours() mendukung this.add('hours', 1);

Bisakah Anda menambahkan fungsi-fungsi ini ke momen.. Akan sangat menyenangkan jika dapat membulatkan ke interval waktu terdekat, berikutnya dan sebelumnya... Ada jutaan hasil google untuk ini dan ratusan upvotes stack overflow..

Sekarang saya melihatnya lagi, saya tidak tahu bagaimana cara kerja incrementHours.
Saya telah mengedit posting saya untuk masalah dengan kode yang diperbaiki. Menikmati!

Pada Senin, 10 Maret 2014 pukul 14:29, Blake Niemyjski
[email protected] menulis :

Apa fungsi Anda untuk incrementHours? Saya kira itu juga berhari-hari
juga.

Balas email ini secara langsung atau lihat di Gi tHubhttps://github.com/moment/moment/issues/959#issuecomment -37223821
.

terima kasih untuk metode itu @zbarnett . Persis apa yang saya butuhkan untuk proyek saya

Nah kita bisa menggunakan antarmuka startOf seperti ini startOf(15, 'm') . Dapat bekerja untuk semua unit. Di tunggu PRnya :)

Inilah rumus yang cukup sederhana (dalam sintaks Coffeescript, karena itulah konteks di mana saya mengalami masalah ini):

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

Saya cukup sibuk dengan hal-hal lain sekarang, tetapi jika seseorang ingin mengambil kode ini dan memasukkannya langsung ke PR, jangan ragu.

Menutup mendukung #1595

Tidak perlu rumit, matematika sederhana:

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)

Keluaran ke kuartal 15 menit terdekat.

Saya tidak bisa membuat solusi @janwerkhoven berfungsi, jadi ini milik saya:

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()));

@ground5hark

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

Diuji pada Pena Kode

Bagian yang penting adalah melakukan .clone() . Tanpa itu, Anda akan mengedit moment() yang merupakan perangkap umum saat menggunakan Moment.js.

Coba ini guys

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

Terlambat ke pesta, aku tahu, tapi...

Fungsi nearestMinutes @janwerkhoven tidak benar; itu berarti itu akan dibulatkan ke atas ATAU ke bawah tergantung pada menit, jadi pembulatan ke 15 terdekat kita harapkan 12:34 -> 12:30 dan 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

Solusi @Silviusconcept mengatasi ini dengan minutesRounded

@kevlarr
Math.round(39/15) mengembalikan 3 bukan 2.
Math.round(39/15) * 15 mengembalikan 45 bukan 30.

Haha itulah yang saya dapatkan karena membaca terlalu banyak utas di penghujung hari ketika saya belum tidur.. Saya melakukan Math.floor

Saya suka _zbarnett solution_ ! Mudah digunakan
Sedikit pembaruan untuk fungsi _ this.milliseconds(0); _

var newdate=turno.date.clone().roundNext15Min().add(antisipasi, 'menit');

moment.fn.roundNext15Min = function () {
var interval = Math.floor(this.minutes() / 15);
jika(ini.menit() % 15 != 0)
interval++;
if(interval == 4) {
this.add('jam', 1);
interval = 0;
}
this.minutes(interval * 15);
this.detik(0);
_ this.milidetik(0); _
kembali ini;
}

Jawaban versi saya

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

Gunakan seperti ini:

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

Fungsi-fungsi ini akan mengubah objek asli, gunakan clone() bila diperlukan

solusi lain adalah:
let next15Minutes = moment().add(15, 'minutes'); next15Minutes.minutes(Math.floor(next15Minutes.minutes() / 15) * 15); next15Minutes.format('HH:mm');

Apakah halaman ini membantu?
0 / 5 - 0 peringkat