Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 如何使用Groovy';s.format()方法?_Date_Groovy_Format - Fatal编程技术网

Date 如何使用Groovy';s.format()方法?

Date 如何使用Groovy';s.format()方法?,date,groovy,format,Date,Groovy,Format,我有一组使用以下代码保存到数据库的日期(我无法更改): groovy中是否没有干净的方法来重新格式化并在用户的本地时区中显示日期?比如 dateCreated.format('h:mm a MMMM dd, yyyy', Locale.US) Groovy中没有类似的东西吗?这是唯一的解决办法吗 import java.text.SimpleDateFormat String date = dateCreated.format('h:mm a MMMM dd, yyyy') def fmt

我有一组使用以下代码保存到数据库的日期(我无法更改):

groovy中是否没有干净的方法来重新格式化并在用户的本地时区中显示日期?比如

dateCreated.format('h:mm a MMMM dd, yyyy', Locale.US)
Groovy中没有类似的东西吗?这是唯一的解决办法吗

import java.text.SimpleDateFormat

String date = dateCreated.format('h:mm a MMMM dd, yyyy')
def fmt = new SimpleDateFormat('h:mm a MMMM dd, yyyy', Locale.US);
Date local_time = fmt.parse(date);
String formatted_local = local_time.format('h:mm a MMMM dd, yyyy')
formatted_local
Groovy日期文档:


参考:

在Groovy中应该非常简单

假设使用下面的语句保存日期

def date = new Date()
println date
println date.format('yyyy/MM/dd HH:mm', TimeZone.getTimeZone('IST'))
输出

Sun Apr 16 11:10:14 UTC 2017
若您需要将其转换为具有特定日期时间格式的特定时区,只需使用下面的语句即可

def date = new Date()
println date
println date.format('yyyy/MM/dd HH:mm', TimeZone.getTimeZone('IST'))
将显示输出:

2017/04/16 16:40
注意:源采用
UTC
格式,并将现有日期转换为
IST
格式

如果您需要日期对象(而不是上面提到的字符串),请使用以下命令:

def date = new Date()
def dtFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
def dt = date.format(dtFormat, TimeZone.getTimeZone('IST'))
assert dt instanceof String

def newDate = Date.parse(dtFormat, dt)
assert newDate instanceof Date
您可以快速在线尝试

tl;博士 语法 对不起,我不知道Groovy语法,所以这是Java语法

java.util.Date::toString
您是说通过调用将值作为文本数据类型保存到数据库中吗

因此,现在需要使用默认格式解析字符串,例如
Mon Apr 03 16:49:56 PDT 2017
,以返回到日期时间对象

首先,您必须已经知道这是一种可怕的存储日期时间值的方法。这种格式假定为英语,并删掉任何小数秒。这种格式很难被人类读取,也很难被机器解析。它使用3-4个字母的伪时区缩写,如
PDT
IST
,它们不是真正的时区,没有标准化,甚至不是唯一的(!)。格式为
大陆/地区
,例如,或
太平洋/奥克兰

ISO 8601 相反,序列化日期时间值时,请使用标准格式

在解析和生成字符串时,这些类默认使用标准格式

避免遗留日期时间类 要知道,
java.util.Date
是与最早版本的java捆绑在一起的设计糟糕、令人困惑的旧日期时间类之一。这些类现在是遗留的,被类所取代。避免遗留类,改用java.time

使用java.time
DateTimeFormatter
类解析字符串。我们必须定义一个格式化模式来匹配
Date::toString
的输出

String input = "Mon Apr 03 16:49:56 PDT 2017" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd HH:mm:ss z uuuu", Locale.US ) ;
现在我们可以将该字符串解析为
ZonedDateTime

ZonedDateTime zdt = ZonedDateTime.parse ( input, f ) ;
zdt.toString():2017-04-03T16:49:56-07:00[美国/洛杉矶]

通常,序列化数据存储和交换的日期-时间值的最佳实践是以UTC格式保存该值,然后以标准ISO 8601格式生成字符串。ISO 8601中UTC的惯例是附加一个
Z
,缩写为
Zulu
,意思是UTC

该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

instant.toString():2017-04-03T23:49:56Z

JDBC 你的问题和评论不清楚。如果您的值使用正确的日期时间类型存储在数据库中,那么就没有必要像上面讨论的那样乱处理字符串。如果存储正确,您应该让您的JDBC驱动程序在必要时进行转换时,执行从数据库中获取数据的工作

符合JDBC 4.2及更高版本的驱动程序可以通过
PreparedStatement::setObject
ResultSet::getObject
直接使用java.time类型


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和。

我不理解您的问题,但是如果您认为可以在Java中完成,那么也可以在Groovy中完成,因为Java代码段是有效的Groovy。我会使用
Date.parse('h:mm a MMMM dd,yyyy','2007年6月27日下午6:31')
有更通用的方法吗?i、 e.假设日期以“MM-d-yyy-h-MM-s”格式存储在数据库中,我如何使用date.parse以新格式打印日期?您将日期保存为数据库中的字符串?对于这个项目,它们以日期SQL类型(插入Grails)存储,但我一般是这样问的。首先,我的gross解决方案的第行将它们转换为字符串,因为SimpleDataFormat将其作为输入。这就是问题的原因。@DevonLuongo,你有机会看看提供的解决方案并试一试吗?仅供参考,像、
java.text.SimpleTextFormat
这样麻烦的旧日期时间类现在被这些类取代了。我下次会试试。Groovy/Grails似乎默认为Java.util.Date,所以我假设它是标准的。不过Java.time看起来要好得多。@DevonLuongo将Java.time与遗留类进行比较就像与本田汽车进行比较一样——实际上根本没有比较。更新:不幸的是,Grails与Java.time存在兼容性问题。已在此处发布临时解决方案:
Instant instant = zdt.toInstant() ;
String output = instant.toString() ;