【问题标题】:How can I update a date variable in an API URL query string如何更新 API URL 查询字符串中的日期变量
【发布时间】:2021-11-19 18:11:00
【问题描述】:

我正在使用 fetch API 从服务器检索一些 JSON 数据。

fetch 调用看起来像这样,它依赖于查询字符串中的当前日期来返回当前日期的数据。

fetch(`https://www.some-url/apps/bookings/calendar-json.php?todayDate=${year}-${month}-${day}`)
  .then(r => r.json)... ``

返回的数据实质上显示了 API url 中设置的当前日期的可用预订。

我想要一组控件,允许用户将日期增加或减少 1 天,以通过获取新数据来显示该特定日期的预订。为此,我将获取 ISO 格式的当前日期(如下所示),然后将年、月、日拆分为单独的变量并在 API 查询字符串中使用这些变量。 -

const date = new Date();
const isoFormat = date.toISOString();
const currentDate = isoFormat.substr(0,10);

然后,是否可以通过递增/递减操作日期变量以在 API URL 中获取前几天或后几天的日期?我想有点像计数器。

或者有没有更好的方法来处理这个问题?像 moment.js 之类的包?

【问题讨论】:

  • 您必须小心使用.toISOString(),因为根据您的时区,它可能会返回错误的日期。即,它总是返回 UTC 日期,因此例如中欧时间 (UTC+2) 中的 2021-09-27T01:00:00 将变为 2021-09-26:23:00:00Z

标签: javascript api date fetch query-string


【解决方案1】:

我通过创建一组控件来将日期递增/递减一天来解决这个问题。我使用上述答案之一来帮助实现这一目标。我没有将日、月、年拆分为自己的变量,而是将其保留为一个变量。

let date = new Date();
let today = date.setTime(date.getTime());
let day = 24 * 60 * 60 * 1000;
let dateVal;
let urlDate;

next.addEventListener("click", (e) => {
  dateVal = today += day;
  urlDate = new Date(dateVal);
  let formattedDate = urlDate.toISOString().slice(0, 10);
  console.log(formattedDate);
});

prev.addEventListener("click", (e) => {
  dateVal = today -= day;
  urlDate = new Date(dateVal);
  let formattedDate = urlDate.toISOString().slice(0, 10);
  console.log(formattedDate);
});

【讨论】:

    【解决方案2】:

    如果你想增加/减少日期,更容易使用单独的变量,年,月和日:

    let today = new Date();
    let yyyy = today.getFullYear();
    let mm = today.getMonth()+1; // getMonth() is zero-based
    let dd  = today.getDate();
    

    或者你可以直接使用日期对象,

    let offsetByDays = (24*60*60*1000) * 2; //2 days
    let date= new Date();
    date.setTime(date.getTime() - offsetByDays );
    let formattedDate = date.toISOString().slice(0,10);
    

    对于 moment.js,请参阅:momentJS date string add 5 days

    注意:您在使用.toISOString() 时也需要考虑时区。

    【讨论】:

    • 谢谢你,我认为我关于递增/递减的问题是我不确定 Date API 或 Moment 是否知道每个月有多少天,或者一年中有多少个月.所以例如。当一个月增加超过 30/31 天时,月份是否增加 1?我必须自己定义这个逻辑吗?
    • 是的,Date 对象可以处理这些情况。但同样,请注意,根据您所在的时区,toISOString 可能有一天会关闭...
    • @i-am-niall 如果您使用了时刻,我敢肯定,如果您将例如 30 天添加到某个日期,那么如果您到达月底,它将增加月份,同样适用年份,手动,如果您使用第一种方法,分别处理 yyyy、mm 和 dd,则应自己实现
    猜你喜欢
    • 2014-06-23
    • 1970-01-01
    • 2013-08-16
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多