【问题标题】:Subtract x days from a String Date - React从字符串日期中减去 x 天 - React
【发布时间】:2021-07-19 14:26:12
【问题描述】:

假设我有一个字符串格式的日期,例如“2021-07-19”。如何从表示为字符串的日期中减去 x 天?

我曾尝试先将字符串转换为日期,然后减去天数,然后再转换回字符串,但这不起作用。

const dateString = "2021-07-19"
const previousDayDate = new Date(dateString)
previousDayDate.setDate(previousDayDate.getDate() - 1)
const previousDayDateString = previousDayDate.toString()

最终结果应该是“2021-07-18”。相反,我将日期作为完整字符串:Sun Jul 18 2021 01:00:00 GMT+0100 (British Summer Time)

【问题讨论】:

  • 使用 moment.js。 npm i moment 和用法:moment(youDate).diff('days', 'otherDate');
  • 有没有办法在不使用moment 的情况下做到这一点?据我所知,使用moment 时会出现警告,因为它很快就会被弃用(或者我相信它的某些部分)。
  • date-fns.org 有帮助处理日期的有用方法。
  • 是的,但它的工作时间足以更新您的代码。

标签: javascript reactjs react-native date


【解决方案1】:

您得到错误日期的原因是“2021-07-19”被内置解析器解析为 UTC,但您使用的所有其他方法都是本地的,因此您似乎得到了错误的日期或时间。除此之外,您的算法是合理的。只需将字符串解析为本地字符串即可:

// Parse string in YYYY-MM-DD format as local
function parseISOLocal(s) {
  let [Y, M, D] = s.split(/\W/);
  return new Date(Y, M-1, D);
}


console.log(parseISOLocal('2021-07-20').toString());

这是一个很常见的问题。

【讨论】:

    【解决方案2】:

    请注意,在我将输入日期更改为 YYYY-MM-DD 之前,下面的 sn-p 在我的语言环境中不起作用。

    // const dateString = "2021-19-07" - your format
    const dateString = "2021-07-19" // format testable in my locale
    const previousDayDate = new Date(dateString)
    previousDayDate.setDate(previousDayDate.getDate() - 1)
    const previousDayDateString = `${previousDayDate.getFullYear()}-${('0' + (previousDayDate.getMonth()+1)).slice(-2)}-${('0' + previousDayDate.getDate()).slice(-2)}`;
    console.log(previousDayDateString)

    【讨论】:

    • 感谢您的回答。但是,我可以看到 sn-p 显示结果减去 1 个月而不是 1 天。无论如何,我在下面的回答中做了几乎相同的事情。
    • 谢谢,忘了那些是从零开始的。答案已更新
    • 谢谢。但是,它仍然显示为同一日期(2021-07-19)
    • 好的。道歉。我不小心将 getDate 视为从零开始,但事实并非如此。那是固定的。奇怪的是,它现在给了我 2021-07-17 的 console.log - 但不是你?
    • 它给了我“2021-07-18”,这是我认为我们想要的(从 2021-07-19 中减去 1 天)
    【解决方案3】:

    使用 Moment.js

    const dateString = moment("2021-07-19", "YYYY-MM-DD").startOf("day")
    const previousDayDateString = dateString.subtract(1, "days").format("YYYY-MM-DD");
    

    【讨论】:

    • OP 明确表示他们没有使用 moment 也没有标记
    【解决方案4】:

    谢谢大家的建议。我遵循与 Spencer 上述评论 (How to format a JavaScript date?) 相同的惯例:

    const dateString = "2021-07-19"
    const previousDayDate = new Date(dateString)
    previousDayDate.setDate(previousDayDate.getDate() - 1)
    
    const previousDayString = previousDayDate.toLocaleDateString("en-CA").split(",")[0]
    
    console.log(previousDayString)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 2021-02-25
      • 2012-10-07
      • 1970-01-01
      相关资源
      最近更新 更多