如何在Groovy中在特定日期和时间创建新Date

7qhs6swi  于 2022-11-01  发布在  其他
关注(0)|答案(6)|浏览(166)

我想知道除了用Date.parse方法从String中解析它之外,是否还有其他方法可以在特定的日期和时间在Groovy中创建新的Date。我可以得到在Groovy中创建Date的完整列表吗?

ibrsph3r

ibrsph3r1#

您可以使用现有的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()方法从一个map中构建一个日期。你可以这样使用它们:

// 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)
agxfikkp

agxfikkp2#

其他的答案在Java8和更高版本中已经过时了。旧的遗留日期-时间类,如java.util.Date/.Calendar/.GregorianCalendar,已经被证明是设计糟糕、混乱和麻烦的。

java.时间

java.time框架取代了那些旧的类。
Groovy当然可以使用这些类。我不知道Groovy的语法,但是改编这个简单的Java示例应该很容易。

第一个月/第一个月

LocalDateLocalTime类没有时区的概念,因此它们不表示时间线上的实际时刻。

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();
snz8szmq

snz8szmq3#

Groovy不错。

new Date(2016-1900, 7, 16, 20, 32, 25)

太平洋夏令时2016年8月16日星期二20:32:25
请注意,必须对年份进行处理,但您可以创建一个新的Java Date来表示所需的任何秒。
您可以在http://mrhaki.blogspot.com/2009/08/groovy-goodness-working-with-dates.html上看到更多Groovy Goodness

smdnsysy

smdnsysy4#

据我所知,没有其他的方法。你也可以把精确的时间传递给Date类的构造函数,但是首先你需要得到时间。
也许这个link会有帮助。
或以下代码片段:

def calendar = new GregorianCalendar(2011,1,7,15,7,23)
def date = calendar.getTime()
println date
jckbn6z7

jckbn6z75#

您可以使用Date()获取当前日期,并使用以下命令将其格式化为您想要的格式:

/*
     y: year
     m: month
     d: day
     h: hour
     m: minute
    */

Date().format('yyyy-MM-dd hh-mm') 
Date().format('yy/mm/dd hh')

返回类型为字符串。

w80xi6nr

w80xi6nr6#

LocalDateTime.now为“年-月(日(小时-分钟”

相关问题