Groovy UTC 日期格式

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

好的,所以我正在编写一个简单的 UTC 日期格式化脚本,该脚本采用 UTC 并将其转换为日期和时间的特定格式。我可以让脚本在 javascript 中正常工作,但我使用的插件显然需要 Groovy。我不熟悉它,有人告诉我编程本质上是一样的,因为它可以使用 javascript 库/语言。无论如何,这是我的代码片段:

import java.util.*;

var d = new Date();
var CurrentDay = ('0' + d.getUTCDate()).slice(-2);
var CurrentMonth = ('0' + d.getUTCMonth()).slice(-2);
var CurrentYear = d.getUTCFullYear();
var CurrentHours = ('0' + d.getUTCHours()).slice(-2);
var CurrentMinutes = ('0' + d.getUTCMinutes()).slice(-2);
var CurrentSeconds = ('0' + d.getUTCSeconds()).slice(-2);
var DateFormatted = CurrentYear.toString() + CurrentMonth.toString() + CurrentDay.toString() + CurrentHours.toString() + CurrentMinutes.toString() + CurrentSeconds.toString();
return DateFormatted;

当我尝试运行脚本时收到此错误消息:

groovy.lang.MissingMethodException: No signature of method: Script1.var() is applicable for argument types: (java.util.Date) values: [Thu Jun 06 21:18:43 CDT 2013]
Possible solutions: wait(), run(), run(), every(), any(), wait(long)
Parameters:
{}

任何帮助将不胜感激。另外,我可以让这个脚本完全按照我想要的正常 javascript 运行。

javascript datetime groovy datetime-format java-time
3个回答
21
投票

JavaScript 中的

var
相当于 Groovy 中的 "def"。此外,在 Groovy 中使用 Groovy Date:

设置日期格式更容易
TimeZone.setDefault(TimeZone.getTimeZone('UTC'))
def now = new Date()
println now
println now.format("MM/dd/yyyy'T'HH:mm:ss.SSS'Z'")


//Prints:
Fri Jun 07 02:57:58 UTC 2013
06/07/2013T02:57:58.737Z

您可以根据需要修改格式。有关可用格式,请参阅SimpleDateFormat


9
投票

tl;博士

这里是 Java 语法,但您也可以在 Groovy 中调用 java.time 类。

Instant.now()
       .toString()

2017-01-23T01:23:45.654321Z

避免遗留类

问题和其他答案使用了麻烦的旧日期时间类,这些类现在已经被遗留下来,被 java.time 类取代。

使用java.time

显然您想生成标准 ISO 8601 格式的字符串,表示 UTC 时区的日期时间值。

java.time.Instant
类表示 UTC 时间轴上的一个时刻,分辨率为纳秒。

Instant instant = Instant.now() ;

java.time 类在解析/生成字符串时默认使用 ISO 8691 格式。

String output = instant.toString() ;

2017-01-23T01:23:45.987654321Z

如果您想要整秒,没有分数,请截断

Instant instant = Instant.now().truncatedTo( ChronoUnit.SECONDS ) ;

3
投票

您通常不应该仅仅为了本地利益而更改默认时区,因为这会影响 JVM 中的所有代码 - 例如,它可能希望实际的本地时区成为默认时区。因此,使用 TimeZone.setDefault() 是一种不好的做法,除非您确定所有代码都需要该时区并且所有代码都是您的并且永远不会改变。有很多问题要问。

相反,您应该在通话中明确指定感兴趣的时区。

一旦获得 DateFormatter 实例,您将需要对其调用 setTimeZone(TimeZone.getTimeZone('UTC')) 。这将使格式化程序使用该时区。您还可以使用任何其他时区。

最后,您将调用 dateFormat.format(Date date) 方法来获取该日期的字符串表示形式,采用所选的语言环境、样式和时区。

如果您不想要特定于区域设置的格式,但想要修复为您自己的格式,例如 ISO,则您将需要使用 SimpleDateFormat 来代替使用上述静态工厂方法创建 DateFormat 实例。具体来说,您将使用 new SimpleDateFormat(String pattern) 构造函数。该模式将遵循 SimpleDateFormat JavaDoc 中的定义,例如可以是“yyyy-MM-dd HH:mm:ss.SSS”。

然后,您可以在该 SimpleDateFormat 实例上调用 setTimeZone() 方法,与(任何)DateFormat 相同。在 Groovy 中,您可以跳过显式的 SimpleDateFormat 创建,而是可以使用 Groovy Date 增强功能,它的 format(String format, TimeZone tz) 方法 - 它将在幕后执行 SimpleDateFormat 的操作。

特定于区域设置的格式方法示例(Java 和/或 Groovy):

String gimmeUTC(Date date, Locale locale) {
  DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, locale);
  dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
  return dateFormat.format(date);
}

固定格式方法示例(Java 和/或 Groovy):

String gimmeUTC(Date date, Locale locale) {
  DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
  dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
  return dateFormat.format(date);
}

固定格式示例(仅限 Groovy):

String gimmeUTC(Date date) {
  return date.format('yyyy-MM-dd HH:mm:ss.SSS', TimeZone.getTimeZone('UTC'));
}
© www.soinside.com 2019 - 2024. All rights reserved.