2015-05-12 18 views
3

我有一个值为[180, 360, 540, 720, 900, 1080, 1260]的数组。每个数组项描述UTC后午夜后的分钟数。如何使用momentjs从数组中找到距当前时间最近的时间?

使用momentjs,我怎样才能找到最接近当前'Europe/London'时间的数组项目?

到目前为止,我已经能够得到使用moment-timezone.js当前'Europe/London'时间:

var currentTime = moment().tz('Europe/London'); 

但我现在努力寻找最接近的阵列项目currentTime

+0

你到目前为止做了什么?将矩阵减少与矩量距离函数结合起来似乎是一条直接的路径。 – doldt

+0

为什么你在特定时区获得时间并将其与UTC比较?直到您格式化为止,“当前[区域]时间”与其他地方的时间没有什么不同。 – ssube

+0

@ssube a)我有UTC的JSON值(我无法帮助,这正是我从我的API调用中得到的)。 b)我的网站需要在欧洲/伦敦时间显示所有时间,无论您的计算机系统时钟或您在世界的哪个位置。 – henrywright

回答

1

如果可能的话,你应该保持的值,直到UTC你准备好格式。时区和日期格式通常是本地化的一部分,而不是您希望在业务逻辑中嵌入太深的内容。请注意,时区已经改变了当地的时间流逝,这对每个人来说都是一场噩梦。

var now = moment.utc(); 
 
var target = now.hours() * 60 + now.minutes(); 
 
var data = [180, 360, 540, 720, 900, 1080, 1260] 
 

 
var sorted = data.sort(function(a, b) { 
 
    var dA = Math.abs(a - target), 
 
    dB = Math.abs(b - target); 
 
    if (dA < dB) { 
 
    return -1; 
 
    } else if (dA > dB) { 
 
    return 1; 
 
    } else { 
 
    return 0; 
 
    } 
 
}); 
 

 
document.getElementById('r').textContent = JSON.stringify(sorted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.2/moment.min.js"></script> 
 
<pre id="r"></pre>

的第一个元素则是最接近的,其次是:

随着您的输入数据和比较数据都在UTC,您可以通过绝对差阵列简单排序按距离顺序休息。

+0

关于UTC说的,你应该使用'moment.utc()'而不是'moment()'吗? – henrywright

1

试试这个

var x= [180, 360, 540, 720, 900, 1080, 1260] 

closestTime=500 
var newar=[] 

for(i=0;i<x.length;i++){ 
newar.push(Math.abs(closestTime-x[i])) 
} 

var i = newar.indexOf(Math.min.apply(Math, newar)); 
console.log(x[i]) 
+0

感谢您的解决方案。 – henrywright

相关问题