javascript 有没有办法使两个字符串(例如两个时间字符串,如“4:00”和“5:00”)具有可比性?

zaq34kh6  于 2023-03-11  发布在  Java
关注(0)|答案(5)|浏览(104)

我希望能够比较2时间字符串,如:

"4:00" > "5:00"

当然,这应该返回false。
是否有一种方法能够以线性方式Map或分配这些字符串的值(例如“5:00“的值应大于“4:00”的值)?不涉及特定日期。
我可以使用的方法是手动将其放入一个typescript枚举中,该枚举会自动添加递增值

enum time {
"01:00",
"02:00",..
}

console.log("Value is: "+time["01:00"])
console.log("Value is: "+time["02:00"])

该函数返回:

Value is: 0
Value is: 1

但是这个方法只在预定义的时间起作用。在上面的例子中,时间(“04:21”)将不起作用。

b5lpy0ml

b5lpy0ml1#

将它们创建为日期,然后进行比较。

const timeA = '4:21';
const timeB = '05:00';

new Date(`2000-01-01 ${timeA}`).getTime() > new Date(`2000-01-01 ${timeB}`).getTime();
fdx2calv

fdx2calv2#

字符串比较应该在这里工作。

"4:00" > "5:00" // would yield false
jum4pzuy

jum4pzuy3#

由于字符串的格式是固定的,所以我认为您可以将字符串分为小时部分和分钟部分,然后先比较小时,然后再比较分钟。
为了比较8(am)到7(pm)范围内的小时部分,我们可以简单地将其偏移+4,然后取模12,就像我们的小时系统突然从11跳回到0一样。
样本代码

function isAfter(time1, time2) {

  var time1Arr = time1.split(":");
  var time2Arr = time2.split(":");
  var hour1 = parseInt(time1Arr[0]);
  var minute1 = parseInt(time1Arr[1]);
  var hour2 = parseInt(time2Arr[0]);
  var minute2 = parseInt(time2Arr[1]);
  var hour1Offset = (hour1 + 4) % 12;
  var hour2Offset = (hour2 + 4) % 12;
  
  if (hour1Offset === hour2Offset) return minute1 > minute2;
  return hour1Offset > hour2Offset;
}
rta7y2nd

rta7y2nd4#

由于您指定8-12在AM范围内,0-7在PM范围内:
由于JS不允许运算符重载,我们不能直接使用〉、〈或=,但是我们可以定义一个函数,在每种情况下返回-1、0或1(或者修改每个运算符的true/false,尽管这被省略了)。

/**
 * @brief Normalizes time to an hour minute object in 24-hour time
 * @condition the time is between 8AM and 7PM
 */
function normalizeTime(time: string) {
  if(typeof time !== "string" || !/\d{1,2}:\d{2}/.test(time)) // Test whether the time is a string and whether it is in the correct format
    throw new Error("Invalid Time Format"); // TODO: implement correct time handling
  let [hour, minute] = time.split(":").map(str => parseInt(str));
  if(hour < 8) {
    hour += 12;
  }
  if(hour > 24 || hour < 0 || minute > 59 || minute < 0)
    throw new Error("Invalid Time (hours or minutes out of bounds)"); // TODO: implement correct time handling
  return {
    hour,
    minute
  };
}
  
/**
 * @brief Compares two time strings in the format H?H:MM, with the time range 8AM-7PM
 * @returns -1 if timeA is before timeB, 1 if timeA is after timeB, and 0 if timeA is at the same time as timeB
 */
function compareTimes(timeA: string, timeB: string): -1 | 0 | 1 {
  const timeAN = normalizeTime(timeA);
  const timeBN = normalizeTime(timeB);
  if(timeAN.hour === timeBN.hour && timeAN.minute === timeBN.minute)
    return 0;
  if(timeAN.hour > timeBN.hour || (timeAN.hour == timeBN.hour && timeAN.minute > timeBN.minute))
    return 1;
  return -1;
}

x一个一个一个一个x一个一个二个x

7lrncoxx

7lrncoxx5#

更新--假设7:00表示PM,8:00表示AM,我们需要一个比padStart更强的规范化。这个答案的旧版本如下。这里我们通过添加一个normalize函数进行更新。)
你不能这样使用<,JavaScript没有任何运算符重载,但是你可以写一个函数来重载,例如:

const normalize = (time, [h, m] = time .split (':') .map (Number)) =>
  String ((h < 8 ? h + 12 : h) || 12) .padStart (2, '0') + ':' + m
  
const compareTimes = (a, b, x = normalize (a), y = normalize (b)) =>
  x < y ? 'less than' : x > y ? 'greater than' : 'equal'

console .log (compareTimes ('4:00', '5:00'))   //=> "less than"
console .log (compareTimes ('10:15', '5:30'))  //=> "less than"
console .log (compareTimes ('2:00', '11:000')) //=> "greater than"
console .log (compareTimes ('9:30', '09:30'))  //=> "equal"

我们包含一个normalize函数,它将时间转换为hh:mm,将00:00-07:59范围内的时间转换为PM版本,对小时使用一点数学运算,并保持其他时间不变,除了在必要时添加前导0
这里需要注意的重要一点是,"10:15"的比较结果大于"5:30",即使字符串的比较结果与"10:15"相反。
它的一个变体要有用得多,我们可以使用-1+10来代替"less than""greater than""equal",这在大多数C风格语言中都是用来排序的,包括JS,所以如果我们这样重写:

const compareTimes = (a, b, x = a .padStart (5, '0'), y = b .padStart (5, '0')) =>
  x < y ? -1 : x > y ? 1 : 0

我们得到了一个标准比较器,可以在Array.prototype.sort和其他地方使用:

const normalize = (time, [h, m] = time .split (':') .map (Number)) =>
  String ((h < 8 ? h + 12 : h) || 12) .padStart (2, '0') + ':' + m

const compareTimes = (a, b, x = normalize (a), y = normalize (b)) =>
  x < y ? -1 : x > y ? 1 : 0

const times = ['10:00', '9:15', '4:00', '5:00', '4:21', '7:32', '11:59']

console .log (times .sort (compareTimes))
//=> ["4:00", "4:21", "5:00", "9:15", "10:00", "11:59", "7:32"]

我们可能想把它变成一个函数,它不修改原始数组,但返回一个新的排序数组,这是一个很小的添加:
一个三个三个一个

旧版本

你不能这样使用<,JavaScript没有任何运算符重载,但是你可以写一个函数来重载,例如:

const compareTimes = (a, b, x = a .padStart (5, '0'), y = b .padStart (5, '0')) =>
  x < y ? 'less than' : x > y ? 'greater than' : 'equal'

console .log (compareTimes ('4:00', '5:00'))  //=> "less than"
console .log (compareTimes ('10:15', '5:30')) //=> "greater than"
console .log (compareTimes ('9:30', '09:30')) //=> "equal"

这里需要注意的重要一点是,"10:15"的比较结果大于"5:30",即使字符串的比较结果与"10:15"相反。
它的一个变体要有用得多,我们可以使用-1+10来代替"less than""greater than""equal",这在大多数C风格语言中都是用来排序的,包括JS,所以如果我们这样重写:

const compareTimes = (a, b, x = a .padStart (5, '0'), y = b .padStart (5, '0')) =>
  x  y ? 1 : 0

我们得到了一个标准比较器,可以在Array.prototype.sort和其他地方使用:

const compareTimes = (a, b, x = a .padStart (5, '0'), y = b .padStart (5, '0')) =>
  x < y ? -1 : x > y ? 1 : 0

const times = ['10:00', '9:15', '4:00', '5:00', '4:21', '17:32', '11:59']

console .log (times .sort (compareTimes))
//=> ["4:00", "4:21", "5:00", "9:15", "10:00", "11:59", "17:32"]

我们可能想把它变成一个函数,它不修改原始数组,但返回一个新的排序数组,这是一个很小的添加:

const compareTimes = (a, b, x = a .padStart (5, '0'), y = b .padStart (5, '0')) =>
  x < y ? -1 : x > y ? 1 : 0

const sortTimes = (times) => [...times] .sort (compareTimes)

const times = ['10:00', '9:15', '4:00', '5:00', '4:21', '17:32', '11:59']

console .log ('Sorted:', sortTimes (times)) 
//=> ["4:00", "4:21", "5:00", "9:15", "10:00", "11:59", "17:32"]

console .log ('Original is not modified: ', times)
//=> ['10:00', '9:15', '4:00', '5:00', '4:21', '17:32', '11:59']
.as-console-wrapper {max-height: 100% !important; top: 0}

相关问题