【问题标题】:App script returns current week as 3 while it's week 2应用脚本在第 2 周时将当前周返回为第 3 周
【发布时间】:2021-01-12 20:13:55
【问题描述】:

要获取当前周,我有这段代码:

 var today = new Date();
  var week = Utilities.formatDate(today, "Europe/Amsterdam", "w"); 

这会将today 返回为Tue Jan 12 2021 11:30:42,这是正确的,因为我在阿姆斯特丹。但是它在第 2 周时将当前周返回为 3。回顾上周的日志,它在第 1 周时返回了第 2 周。在此之前的一周,它返回了第 53 周,这是正确的。所以这一直很好,直到新的一年,它完全跳过了第一周。 有关如何解决此问题的任何想法?

【问题讨论】:

  • 是什么让您认为这是第 2 周? Apps Script 的 formatDate 是根据 Java 的 SimpleDateFormat 格式化日期,它也返回第 3 周。因此,如果这实际上应该是第 3 周而不是第 2 周,那么这将是 Java 类的问题,而不是 Apps 脚本的问题方法。
  • 我使用的是 ISO 周数格式,将当前周作为 2021 年的第二周。我发现这不是 App 脚本问题,因此能够通过变通方法修复它。谢谢!

标签: google-apps-script google-sheets


【解决方案1】:

解释:

我认为没有实际问题。

混淆源于1 是从去年开始的这一周。

如果你console.log 的所有日期都是从26th of December 202012th of January 2021

function myFunction() {
  const December = [26,27,28,29,30,31];
  const January =[1,2,3,4,5,6,7,8,9,10,11,12,13];
  December.
  forEach(n=>{console.log(Utilities.formatDate(new Date(2020,11,n), "Europe/Amsterdam", "yyyy-MM-dd"),"Week: ",
Utilities.formatDate(new Date(2020,11,n), "Europe/Amsterdam", "w"))});
  January.
  forEach(n=>{console.log(Utilities.formatDate(new Date(2021,0,n), "Europe/Amsterdam", "yyyy-MM-dd"),"Week: ",
  Utilities.formatDate(new Date(2021,0,n), "Europe/Amsterdam", "w"))});
}

你会得到这些结果:

2020-12-26 Week:  52
2020-12-27 Week:  1 // Sunday
2020-12-28 Week:  1
2020-12-29 Week:  1
2020-12-30 Week:  1
2020-12-31 Week:  1
2021-01-01 Week:  1
2021-01-02 Week:  1
2021-01-03 Week:  2 // Sunday
2021-01-04 Week:  2
2021-01-05 Week:  2
2021-01-06 Week:  2
2021-01-07 Week:  2
2021-01-08 Week:  2
2021-01-09 Week:  2
2021-01-10 Week:  3 // Sunday
2021-01-11 Week:  3
2021-01-12 Week:  3
2021-01-13 Week:  3

基本上,1st 周从去年的 2020-12-27 开始,2nd 周从 2021-01-03 开始,3rd 周从 2021-01-10 开始,因此根据该逻辑,当前周是 3是你得到的数字。

解决方法:

如果你想调整这个逻辑,你可以从当前周数中减去1,得到2作为当前周数:

 var today = new Date();
 var week = Utilities.formatDate(today, "Europe/Amsterdam", "w") - 1;

或者您可以使用这个answer 并调整周数:

function exampleFunction() {
    Date.prototype.getWeek = function() {
    var onejan = new Date(this.getFullYear(),0,1);
    return Math.ceil((((this - onejan) / 86400000) + onejan.getDay()+1)/7)-1;
    } 
    var now = new Date();
    Logger.log(now.getWeek());
}

唯一的问题是明年的第一周(也可能是今年)将有0 周数。但是您可以使用if 条件对其进行调整,以确保它不会发生。

【讨论】:

  • 感谢您的洞察力!一旦周数再次与 ISO 周数对齐,解决方法是否会过时?我还发现这个答案也可以解决我的问题:stackoverflow.com/questions/6117814/…
  • @MichieltheTemp 查看我更新的答案。问题是在明年的第一周,您将拥有0,但我想您可以使用if 条件对其进行调整。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 2021-04-06
  • 2020-11-13
  • 2017-02-23
  • 2022-12-07
  • 1970-01-01
相关资源
最近更新 更多