舍入时刻.js对象时间到最近的30分钟间隔

Ach*_*ika 55 javascript momentjs

我试图绕过这一刻.时间对象到下一个最近的30分钟间隔.但看起来我的逻辑错了.有人能帮我吗.例如:

10:13am -> 10:30am
11:45am -> 12:00pm
Run Code Online (Sandbox Code Playgroud)

这是我目前的代码

start = moment();
minuteReminder = start.minute() % 30;
start.add(minuteReminder, 'minutes');
start.format("D YYYY, h:mm:ss a");
Run Code Online (Sandbox Code Playgroud)

jtr*_*ans 88

const start = moment('2018-12-08 09:42');
const remainder = 30 - (start.minute() % 30);
 
const dateTime = moment(start).add(remainder, "minutes").format("DD.MM.YYYY, h:mm:ss a");

console.log(dateTime);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

百万种方式来做到这一点.你真的不需要moment.js.无论如何,这是一个.

  • 我认为它应该是`code` 30 - (start.minute()%30) (5认同)
  • 发现此问题的人可能希望包含 `.startOf('month')` 以便重置内在日期对象的秒和毫秒。 (2认同)
  • 这似乎没有达到要求的效果。即使示例片段也没有将 09:42 舍入到_最近的_ 30 分钟间隔;它会将其四舍五入到下一个 30 分钟的间隔。结果应该是 09:30,而不是 10:00。 (2认同)
  • 这个解决方案被破坏了——它增加了 30 分钟。如果日期已经四舍五入。 (2认同)

jan*_*ann 51

基于@Volune和@Cabloo的答案和评论,更新版本可能如下所示:

function round(date, duration, method) {
    return moment(Math[method]((+date) / (+duration)) * (+duration)); 
}
Run Code Online (Sandbox Code Playgroud)

然后可以使用如下:

var date = moment();
var roundedDate = round(date, moment.duration(15, "minutes"), "ceil");
Run Code Online (Sandbox Code Playgroud)

  • 恢复原始时区可能是有意义的,否则这些信息会丢失。Fe 通过在末尾添加 .tz(date.tz()) 。 (2认同)

Vol*_*une 32

通用解决方案:

var ROUNDING = 30 * 60 * 1000; /*ms*/
start = moment();
start = moment(Math.ceil((+start) / ROUNDING) * ROUNDING);
start.format("D YYYY, h:mm:ss a");
Run Code Online (Sandbox Code Playgroud)

您可以ROUNDING从30分钟更改为您想要的任何内容,并Math.ceil通过Math.round或者Math.floor如果您想要另一种方法来更改值.

  • 我喜欢这一个.你可以将ROUNDING变量转换为moment.duration(...),即`function date_round(date,duration){return moment(Math.floor((+ date)/(+ duration))*(+ duration)) ; 像`date_round(moment(),moment.duration(30,'minutes'))`这样使用 (8认同)

小智 5

您可以通过一个简单的 if-else 子句来实现:

if(moment().minute()> 30){
    var myTime = moment().minute(30).second(0);
} else {
    var myTime = moment().minute(0).second(0);
}
Run Code Online (Sandbox Code Playgroud)