Groovy UTC日期格式

o2gm4chl  于 8个月前  发布在  其他
关注(0)|答案(3)|浏览(62)

好的,我正在做一个简单的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。

agxfikkp

agxfikkp1#

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

c2e8gylq

c2e8gylq2#

tl;dr

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

Instant.now()
       .toString()

2017-01-23T01:23:45.654321Z

避免遗留类

Question和其他Answer使用了麻烦的旧日期-时间类,这些类现在已经是遗留的,被java.time类取代。

使用java.time

显然,您希望生成一个标准ISO 8601的String,表示UTC时区中的日期-时间值。
java.time.Instant类以UTC表示时间轴上的时刻,分辨率为纳秒。

Instant instant = Instant.now() ;

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

String output = instant.toString() ;

2017-01-23T01:23:45.987654321Z
如果你想要整秒,没有小数,截断。

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

uhry853o3#

通常,您不应该仅仅为了本地的利益而更改默认时区,因为这会影响JVM中的所有代码-例如,它可能希望实际的本地时区成为默认时区。因此,使用TimeZone.setDefault()是一种不好的做法,除非您确定所有代码都需要该时区,并且所有代码都是您的,并且永远不会更改。这要求太过分了。
相反,您应该在呼叫中显式指定感兴趣的时区。

  • 如果你想使用特定于用户/机器的语言环境的日期/时间格式,你应该使用DateFormat工厂,特别是以下静态方法之一-它们将处理使用任何其他方法(包括SimpleDateFormatter)都无法处理的复杂语言环境/语言细节:
  • getDateTimeInstance()-用于默认区域设置和默认样式。
  • getDateTimeInstance(int dateStyle,int timeStyle)用于默认区域设置和指定样式
  • getDateTimeInstance(int dateStyle,int timeStyle,Locale locale)用于指定的样式和区域设置

一旦你得到了DateFormatter示例,你就需要在它上面调用setTimeZone(TimeZone.getTimeZone('UTC'))。这将使格式化程序使用该时区。您也可以使用任何其他时区。
最后,您将调用dateFormat.format(Datedate)方法来获取该日期的String表示形式,包括所选的区域设置、样式和时区。
如果你不想要特定于语言环境的格式,但想修复自己的东西,如ISO,而不是使用上面描述的静态工厂方法创建DateFormat示例,你会想使用SimpleDateFormat。具体来说,您将使用新的SimpleDateFormat(String模式)构造函数。该模式将遵循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'));
}

相关问题