在 JavaScript Selenium 中验证时间的顺序

问题描述 投票:0回答:1

我的时间清单如下, '一天前, 10天前, 3个月前, 6 个月前'.

如何验证这些日期是升序的?在 javascript 硒中

我想不出尝试任何事情,我对 dd/mm/yyyy 或 mm/dd/yyyy 有一些想法。但当时的这种文本格式让我很困惑。

javascript arrays sorting selenium-webdriver
1个回答
0
投票

您可以详细阐述许多方法,它们的范围从非常简单到更高级。

一个简单的解决方案

这是一个非常简单的变体,假设您的 时间字符串 中始终包含三个部分,因此模式保持不变,即

"<quantity token> <time span token> ago" 

这个想法非常简单

  1. 时间字符串拆分为单独的标记
  2. 将每个标记转换为有意义的表示(定量测量) i。 e.
    <quantity token>
    的数字或
    <time span token>
  3. 的毫秒数
  4. 乘以
    number * number of milliseconds
    即可获取事件发生前的毫秒数。对每个输入时间字符串执行此操作,您将得到一个充满前毫秒数值的数组
  5. 现在您只需确保毫秒数按升序排序

const times = ["a day ago", "10 days ago", "3 months ago", "6 months ago"];

const termsOfQuanity = {
  a: 1,
  an: 1,
  one: 1,
  two: 2,
  three: 3,
  four: 4,
  five: 5,
  six: 6,
  seven: 7,
  eight: 8,
  nine: 9,
  ten: 10,
};

const milliSecondsPerTimeSpan = {
  seconds: 1000,
  minutes: 60000,
  hours: 3600000,
  days: 86400000,
  weeks: 604800000,
  months: 2629800000,
  years: 31557600000,
};
const timeSpans = {
  second: milliSecondsPerTimeSpan.seconds,
  seconds: milliSecondsPerTimeSpan.seconds,
  "second(s)": milliSecondsPerTimeSpan.seconds,
  minute: milliSecondsPerTimeSpan.minutes,
  minutes: milliSecondsPerTimeSpan.minutes,
  "minute(s)": milliSecondsPerTimeSpan.minutes,
  hour: milliSecondsPerTimeSpan.hours,
  hours: milliSecondsPerTimeSpan.hours,
  "hour(s)": milliSecondsPerTimeSpan.hours,
  day: milliSecondsPerTimeSpan.days,
  days: milliSecondsPerTimeSpan.days,
  "day(s)": milliSecondsPerTimeSpan.days,
  week: milliSecondsPerTimeSpan.weeks,
  weeks: milliSecondsPerTimeSpan.weeks,
  "week(s)": milliSecondsPerTimeSpan.weeks,
  month: milliSecondsPerTimeSpan.months,
  months: milliSecondsPerTimeSpan.months,
  "month(s)": milliSecondsPerTimeSpan.months,
  year: milliSecondsPerTimeSpan.years,
  years: milliSecondsPerTimeSpan.years,
  "year(s)": milliSecondsPerTimeSpan.years,
};

function convertTimeStringToDate(timeString) {
  const [quantityToken, timeSpanToken, _] = timeString.split(" ");
  const quantity = convertQuantityTokenToNumber(quantityToken);
  const timeSpan = convertTimeSpanTokenToMilliseconds(timeSpanToken, quantity);
  return timeSpan * quantity;
}

function convertQuantityTokenToNumber(termOfQuantity) {
  const possibleNumberQuantity = parseInt(termOfQuantity);
  if (isNaN(possibleNumberQuantity)) {
    return termsOfQuanity[termOfQuantity];
  }
  return possibleNumberQuantity;
}

function convertTimeSpanTokenToMilliseconds(timeSpan) {
  return timeSpans[timeSpan];
}

const isSortedCorrectly = times
  .map(convertTimeStringToDate)
  .every((time, index, array) => (index > 0 ? array[index - 1] <= time : true));

console.log(`Is sorted correctly? ${isSortedCorrectly}`);

解决方案的一般说明:

  • 步骤 34 非常简单,几乎是每个问题解决方案的一部分。
  • 步骤1(假设您并不总是拥有三个令牌)和2是解决此问题更具挑战性的步骤,在这里您可以编写更复杂的解决方案

可能的改进/替代解决方案

  • 您可以检查token数量,然后根据token数量进行一些处理
    • 例如如果只有一个标记:检查
      today
      yesterday
      等字符串。
    • 如果您有多个令牌,您可以通过反复试验来检查是否可以解析数量令牌,如果不能,请尝试将其解析为时间跨度令牌,看看这是否会为您提供有意义的结果。当然这可能会引入错误
  • 除了在 JS 对象中使用查找之外,您还可以使用(复杂的)RegEx 来区分某些(更复杂的)时间跨度标记,例如
    /days?/i.test(timeSpanToken)
  • 您可以使用一些人工智能模型,它可以为给定的字符串提取以毫秒为单位的值。这可能是唯一可以处理您事先没有预料到的完全意外的时间字符串的变体。
  • 您还可以结合这些方法,也许从捕获最多的简单版本开始,只有当简单版本无法解析字符串时,才将其传递到具有人工智能等的高级版本之一,以保持您的努力(以及人工智能服务的成本)等)低

为什么可能并不总是有明确的答案

可能有一些未量化的术语,例如少数一对等,例如几分钟前几个小时前,那么您如何比较它们?什么更大/更小? 一对还是几个

© www.soinside.com 2019 - 2024. All rights reserved.