【发布时间】:2014-04-03 20:11:39
【问题描述】:
我想知道是否有其他方法可以在特定日期和时间在 Groovy 中创建新的 Date,而不是使用 Date.parse 方法从 String 解析它。我可以获得在 Groovy 中创建 Date 的完整列表吗?
【问题讨论】:
我想知道是否有其他方法可以在特定日期和时间在 Groovy 中创建新的 Date,而不是使用 Date.parse 方法从 String 解析它。我可以获得在 Groovy 中创建 Date 的完整列表吗?
【问题讨论】:
您可以使用现有的 Java 方法来创建日期:
// takes the date encoded as milliseconds since midnight, January 1, 1970 UTC
def mydate = new Date(System.currentTimeMillis())
// create from an existing Calendar object
def mydate = new GregorianCalendar(2014, Calendar.APRIL, 3, 1, 23, 45).time
Groovy 还提供了一些用于创建日期的简化扩展。 Date.parse() 和 Date.parseToStringDate() 从字符串中解析它。 Date.copyWith() 方法从地图构建日期。你可以像这样使用它们:
// uses the format strings from Java's SimpleDateFormat
def mydate = Date.parse("yyyy-MM-dd hh:mm:ss", "2014-04-03 1:23:45")
// uses a format equivalent to EEE MMM dd HH:mm:ss zzz yyyy
def mydate = Date.parseToStringDate("Thu Apr 03 01:23:45 UTC 2014")
def mydate = new Date().copyWith(
year: 2014,
month: Calendar.APRIL,
dayOfMonth: 3,
hourOfDay: 1,
minute: 23,
second: 45)
【讨论】:
Date 的其他可能方式,我一定会接受您的回答。
set()。 def mydate = new Date(); mydate.set(year: 2014, month: Calendar.APRIL, dayOfMonth: 3, hourOfDay: 1, minute: 23, second: 45)@michal.kreuzman
copyWith() 比 set() 更合适。
其他答案在 Java 8 及更高版本中已过时。 java.util.Date/.Calendar/.GregorianCalendar 等旧的旧日期时间类已被证明设计不佳、令人困惑且麻烦。
java.time 框架取代了那些旧类。
Groovy 当然可以使用这些类。我不知道 Groovy 语法,但适应这个简单的 Java 示例应该很容易。
LocalDate/LocalTime
LocalDate 和 LocalTime 类没有时区概念。所以它们并不代表时间线上的实际时刻。
LocalDate localDate = LocalDate( 2016 , Month.JANUARY , 2 ); // year, month, date.
LocalTime localTime = LocalTime( 12 , 30 , 0 , 0 ); // hour, minute, second, nanosecond.
ZonedDateTime应用时区 (ZoneId) 以获取 ZonedDateTime。使用proper time zone name,不要使用常见的 3-4 区域缩写。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.of( localDate , localTime , zoneId );
Instant您应该避免使用旧的日期时间类。但如果需要,您可以转换。 Instant 是 java.time 类,用于表示 UTC 时间轴上的时刻,分辨率为纳秒。在旧的 java.util.Date 类上寻找新的方法来转换成Instant。我们可以从 ZonedDateTime 中提取所需的 Instant 对象。
请注意,从 java.time 转换会导致数据丢失! java.time 类支持nanosecond 分辨率(小数秒最多9 位小数),而旧的java.util.Date 仅支持milliseconds(最多3 位小数)。小数秒的任何第 4 到第 9 位都会被截断。例如,2016-04-28T02:05:05.123456789 被截断为2016-04-28T02:05:05.123。
Instant instant = zdt.toInstant();
java.util.Date utilDate = java.util.Date.from( instant );
往另一个方向发展,从 java.util.Date 到 Instant。小数秒的第 4 到第 9 位小数为零,第 1 到第 3 位为任何毫秒。
Instant instant = utilDate.toInstant();
【讨论】:
Groovy 很好。
new Date(2016-1900, 7, 16, 20, 32, 25)
2016 年 8 月 16 日星期二 20:32:25 PDT
请注意,必须修改年份,但您可以创建一个新的 Java 日期来表示您想要的任何秒数。
您可以在 http://mrhaki.blogspot.com/2009/08/groovy-goodness-working-with-dates.html 看到更多 Groovy Goodness
【讨论】:
您可以使用Date() 获取当前日期并按照您想要的方式对其进行格式化:
/*
y: year
m: month
d: day
h: hour
m: minute
*/
Date().format('yyyy-MM-dd hh-mm')
Date().format('yy/mm/dd hh')
返回类型是一个字符串。
【讨论】:
据我所知,没有其他办法。您还可以将精确的毫秒时间传递给 Date 类的构造函数,但首先您需要以毫秒为单位获取时间。
也许这个link 会有所帮助。
或者这个代码sn-p:
def calendar = new GregorianCalendar(2011,1,7,15,7,23)
def date = calendar.getTime()
println date
【讨论】: