在JavaScript中,如何在Date对象数组中找到最早的日期?

2admgd59  于 2023-03-16  发布在  Java
关注(0)|答案(4)|浏览(292)

我有一个对应于Date对象的字符串数组,如下所示:

const timestamps =  [
  '2023-03-15T10:47:38.878Z',
  '2023-03-15T10:46:51.375Z',
  '2023-03-15T10:46:39.645Z',
  '2023-03-15T10:47:19.072Z',
  '2023-03-15T10:46:20.395Z'
]

var convertedTimestamps = [];
for (var time in timestamps) {
  var timeAsDate = Date.parse(time);
  console.log(time, timeAsDate);
  convertedTimestamps.push(timeAsDate);
}
const min = Math.min(...convertedTimestamps);

它们是日期对象,被解析成字符串,用于其他目的,这可以是任何长度,这只是一个例子,我想找到最早的时间戳。
在上面的示例中,这些是转换后的时间戳,最小值基于数字是正确的,但基于日期对象则不是。

946681200000
978303600000
980982000000
983401200000
986076000000
min: 946681200000
'2023-03-15T10:47:38.878Z'

这可能只是一个数学问题,但我理解它的方式,像这样解析的字符串返回一个int,表示自1970年以来经过了多少时间,所以最早的应该最接近那个时间,不是吗?这个min值实际上是最近的时间戳,当我尝试max值时,它也不正确。

zpjtge22

zpjtge221#

如果所有日期都遵循上述格式,那么对数组进行字符串排序并获取第一个条目就足够了,因为字符串是从最长时间单位到最短时间单位“排序”的。
要获取最早的条目:

const timestamps =  [
  '2023-03-15T10:47:38.878Z',
  '2023-03-15T10:46:51.375Z',
  '2023-03-15T10:46:39.645Z',
  '2023-03-15T10:47:19.072Z',
  '2023-03-15T10:46:20.395Z'
];
const lowest = timestamps.sort()[0];
7d7tgy0s

7d7tgy0s2#

你可以通过修改循环来解决这个问题。循环应该是这样的:

for (var i = 0; i < timestamps.length; i++) {
    var timeAsDate = Date.parse(timestamps[i]); # just adapted this to the loop
    ...
}

这应该可以完成您的工作,因为之前的循环迭代数组的键而不是元素本身,这会导致错误的Date解析,因为在这种情况下,它试图解析索引而不是时间戳。

rjee0c15

rjee0c153#

由于您处理的是ISO 8601时间戳,因此可以将任何字符串与之进行比较
1.将lowest设置为高值字符串a
1.在timestamps上循环
1.如果电流较低,则覆盖
1.日志

const timestamps = [
  '2023-03-15T10:47:38.878Z',
  '2023-03-15T10:46:51.375Z',
  '2023-03-15T10:46:39.645Z',
  '2023-03-15T10:47:19.072Z',
  '2023-03-15T10:46:20.395Z'
];
let lowest = 'a';

for (let timestamp of timestamps) {
    if (lowest > timestamp) {
        lowest = timestamp;
    }
}

console.log('Lowest timestamp: ' + lowest)
// Lowest timestamp: 2023-03-15T10:46:20.395Z

感谢@Derpirscher对此的评论。
实用读物:

erhoui1w

erhoui1w4#

for..in用于迭代对象的属性,而不是数组的属性。2如果你在循环中添加console.log(time),你会发现time是一个字符串,代表数组的每个索引。3如果你改为for..,你的代码就可以工作了。

const timestamps = [
  '2023-03-15T10:47:38.878Z',
  '2023-03-15T10:46:51.375Z',
  '2023-03-15T10:46:39.645Z',
  '2023-03-15T10:47:19.072Z',
  '2023-03-15T10:46:20.395Z'
]

for (var time in timestamps) {
  console.log(time);
}

for (var time of timestamps) {
  console.log(time);
}

此外,除非您需要转换时间戳用于其他用途,否则您可能只希望在循环中获得最小值。

const timestamps = [
  '2023-03-15T10:47:38.878Z',
  '2023-03-15T10:46:51.375Z',
  '2023-03-15T10:46:39.645Z',
  '2023-03-15T10:47:19.072Z',
  '2023-03-15T10:46:20.395Z'
];

let dateTime;
let minDateTime = Date.parse(timestamps[0]);
for (var time of timestamps) {
  dateTime = Date.parse(time);
  if (dateTime < minDateTime)
    minDateTime = dateTime;
}

console.log((new Date(minDateTime)).toISOString());

相关问题