Utilities.formatDate返回错误的周数

时间:2015-12-10 14:28:05

标签: google-apps-script

在Google Script中,我有以下代码:

// year: 30-12-2015
// weekyear: 30-12-201**6**
// week: 1

当我将30-12-2015作为日期插入时,结果将为。

var cursus_datum = sheet.getRange(3,1).getValue();
  Logger.log('type of data: ' + typeof cursus_datum);
  Logger.log(cursus_datum);
  Logger.log(Utilities.formatDate(cursus_datum, SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "d-MM-y HH:mm"));
  Logger.log(Utilities.formatDate(cursus_datum, SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "w"));

在我当地的时区,应该是第53周。不是1。 如果我calculate the week in ISO 8601,则结果为52。

奇怪,不是吗?

编辑: 使用此代码进行新尝试

// type of data: object
// Wed Dec 30 09:00:00 GMT+01:00 2015
// 30-12-2015 00:00 which is perfect
// 1 which is **not** correct.

这导致

{{1}}

错误的一周错误。

2 个答案:

答案 0 :(得分:2)

Utilities.formatDate documentation表示它使用Java SimpleDateFormat - 我觉得这可能是问题的原因,因为它们是Locale敏感的,我会猜测它将使用默认的美国语言环境(我不要不认为传递时区会改变语言环境。问题是美国区域设置日历包含getFirstDayOfWeek() = 1 (SUNDAY)getMinimalDaysInFirstWeek() = 1。对于ISO 8601,您需要分别设置2和4。如果您想要工作一周,我认为您最好坚持使用链接到的Javascript代码。

答案 1 :(得分:1)

new Date()将接受一些不同的参数配置,但您仍需要确保参数正确。您不能只将任何内容插入new Date()如果变量已经是日期类型,那么使用new Date()就没有意义了。您可以使用typeof来测试数据类型。

var dateFromSheet = sheet.getRange(3,1).getValue();
Logger.log('type of data: ' + typeof dateFromSheet);

如果数据类型是字符串,则它必须是有效的日期字符串格式。有几种不同的格式。但是,再次,您需要使用有效的格式。

  • ISO 8601语法“YYYY-MM-DD”或“YYYY-MM”或“YYYY”或“YYYY-MM-DDTHH:MM:SS”
  • 长日期语法 - 年,月,日可以按任意顺序排列:“2015年3月7日”或“2015年3月7日”,月份可以全部写入:“2015年3月7日”
  • 可以使用短日期 - “/”或“ - ”。 “MM / DD / YYYY”或“YYYY / MM / DD”注意:您不能使用“DD / MM / YYYY”
  • 全日期格式 - “Wed Mar DD YYYY HH:MM:SS GMT + 0100(W。欧洲标准时间)”