我想知道在特定日期和时间如何在Groovy中创建新的Date
,而不是使用String
方法从Date.parse
解析它。我可以在Groovy中获得Date
创建的完整列表吗?
答案 0 :(得分:44)
您可以使用现有的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()
从String解析它。 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)
答案 1 :(得分:6)
从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
或从Instant
转换。我们可以从ZonedDateTime
中提取所需的2016-04-28T02:05:05.123456789
对象。
请注意从 java.time转换会导致数据丢失! java.time类支持nanosecond分辨率(在小数秒内最多9位小数位),而旧的java.util.Date仅支持milliseconds(最多3位小数)。小数秒的任何第4到第9位被截断。例如,2016-04-28T02:05:05.123
被截断为Instant instant = zdt.toInstant();
java.util.Date utilDate = java.util.Date.from( instant );
。
Instant
从另一个方向,从java.util.Date到Instant instant = utilDate.toInstant();
。小数秒的第4到第9个小数位为零,第1个第3个小数位为任意毫秒。
docker run -v "$PWD":/home -w /home php:5.6-fpm php /home/irc_bot.php
答案 2 :(得分:2)
据我所知,别无他法。您也可以将精确的毫秒时间传递给Date类的构造函数,但首先需要以毫秒计算时间。
也许这link会有所帮助。
或者此代码段:
def calendar = new GregorianCalendar(2011,1,7,15,7,23)
def date = calendar.getTime()
println date
答案 3 :(得分:1)
Groovy很好。
new Date(2016-1900, 7, 16, 20, 32, 25)
2016年8月16日星期二20:32:25
请注意,必须按摩年份,但您可以创建一个代表您想要的任何秒的新Java日期。
您可以在http://mrhaki.blogspot.com/2009/08/groovy-goodness-working-with-dates.html
看到更多Groovy Goodness答案 4 :(得分:1)
您可以使用Date()
获取当前日期,并按照您希望的方式对其进行格式化:
/*
y: year
m: month
d: day
h: hour
m: minute
*/
Date().format('yyyy-MM-dd hh-mm')
Date().format('yy/mm/dd hh')
返回类型是一个字符串。