好的,所以我正在做一个简单的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:
{}
非常感谢任何帮助。另外,我可以让这个脚本像我想要的那样正常运行。
答案 0 :(得分:13)
在Groovy中,JavaScript中的var
相当于"def"。此外,使用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。
答案 1 :(得分:1)
这里有Java语法,但你也可以在Groovy中调用java.time类。
Instant.now()
.toString()
2017-01-23T01:23:45.987654321Z
问题和其他答案使用现在遗留下来的麻烦的旧日期时间类,取而代之的是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 ) ;
答案 2 :(得分:0)
您通常不应仅为本地利益更改默认时区,因为这会影响JVM中的所有代码 - 例如,它可能希望实际的本地时区是默认值。因此,使用TimeZone.setDefault()是一种不好的做法,除非您确定所有代码都需要该时区,并且所有代码都是您的,并且这永远不会改变。这有很多问题。
相反,您应该明确指定您的通话中感兴趣的时区。
如果要使用特定于用户/机器区域设置的日期/时间格式,则应使用DateFormat工厂,特别是以下静态方法之一 - 它们将采用使用任何其他方法(包括SimpleDateFormatter)无法处理复杂的语言环境/语言细节:
getDateTimeInstance() - for the default locale and default styles.
获得DateFormatter实例后,您需要调用setTimeZone(TimeZone.getTimeZone('UTC'))。这将使格式化程序使用该时区。您还可以使用任何其他时区。
最后,您将调用dateFormat.format(Date date)方法以在所选的区域设置,样式和时区中获取该日期的字符串表示。
如果您不想要特定于语言环境的格式但希望修复自己的某些内容(例如ISO),而不是使用上述静态工厂方法创建DateFormat实例,则需要使用SimpleDateFormat代替。具体来说,您将使用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'));
}