基于TimeZone Java / Groovy的日期时间转换

时间:2013-11-20 00:03:16

标签: java datetime groovy calendar date-format

我在MST,我希望我的日期在太平洋标准时间。我设置了我想要的时区。  现在如果我做c.getTime()我总是得到我的服务器时间。      相反,我想要太平洋日期时间。请帮忙     如何在指定的时区中获取日期时间对象。

   Calendar c= Calendar.getInstance();
   TimeZone timezone= TimeZone.getTimeZone("PST"); 
   c.setTimeZone(timezone)

6 个答案:

答案 0 :(得分:2)

或者,使用JodaTime

@Grab( 'joda-time:joda-time:2.3' )
import org.joda.time.*

def now = new DateTime()
println now.withZone( DateTimeZone.forTimeZone( TimeZone.getTimeZone( "PST" ) ) )

答案 1 :(得分:2)

​TimeZone.setDefault(TimeZone.getTimeZone('PST'))
println new Date() //PST time

您可以根据需要将默认时区设置为PST / MST,然后获取日期。如果可能的话,我会在测试方法中这样做。

答案 2 :(得分:2)

(a)使用Joda-Time(或Java 8中内置的新JSR 310)。甚至不要考虑使用臭名昭着的java.util.Date/Calendar。

(b)你的问题不明确。您对答案的评论与比较有关,但您在提问中没有提及比较。

(c)避免使用3个字母的时区缩写。请阅读TimeZone类的Joda-Time文档中的弃用说明。

(d)避免默认时区。说出你的意思。您的计算机的时区可能会有意或无意地改变。

(e)在'joda'中搜索StackOverflow以获取大量代码片段和示例。

(f)这里有一些Joda-Time示例代码可以帮助您入门。

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.

// Specify your time zone rather than rely on default.
org.joda.time.DateTimeZone californiaTimeZone = org.joda.time.DateTimeZone.forID( "America/Los_Angeles" );
org.joda.time.DateTimeZone denverTimeZone = org.joda.time.DateTimeZone.forID( "America/Denver" );

org.joda.time.DateTime nowDenver = new org.joda.time.DateTime( denverTimeZone );
org.joda.time.DateTime nowCalifornia = nowDenver.toDateTime( californiaTimeZone );

// Same moment in the Universe’s timeline, but presented in the local context.
System.out.println( "nowDenver: " + nowDenver );
System.out.println( "nowCalifornia: " + nowCalifornia );

跑步时......

nowDenver: 2013-11-21T18:12:49.372-07:00
nowCalifornia: 2013-11-21T17:12:49.372-08:00

关于Joda-Time ......

// Joda-Time - The popular alternative to Sun/Oracle's notoriously bad date, time, and calendar classes bundled with Java 7 and earlier.
// http://www.joda.org/joda-time/

// Joda-Time will become outmoded by the JSR 310 Date and Time API introduced in Java 8.
// JSR 310 was inspired by Joda-Time but is not directly based on it.
// http://jcp.org/en/jsr/detail?id=310

// By default, Joda-Time produces strings in the standard ISO 8601 format.
// https://en.wikipedia.org/wiki/ISO_8601

// About Daylight Saving Time (DST): https://en.wikipedia.org/wiki/Daylight_saving_time

// Time Zone list: http://joda-time.sourceforge.net/timezones.html

答案 3 :(得分:1)

tl; dr

ZonedDateTime
.now(
    ZoneId.of( "America/Los_Angeles" )
)

请参阅此code run live at IdeOne.com。 (请注意,今天该站点上的系统时钟似乎慢了半个小时。)

  

zdt.toString():2019-07-27T12:29:42.029531-07:00 [America / Los_Angeles]

java.time

现代方法使用JSR 310中定义的Java 8及更高版本中内置的 java.time 类。

  

我在MST中,而我希望在PST中约会。我设置了我想要的timeZone。

从不依赖于运行时JVM的当前默认时区。作为程序员,您无法控制该默认值。因此,您的代码结果可能会意外地变化。

始终为日期时间方法指定可选的时区参数。

  

现在,如果我执行c.getTime(),我将始终获得服务器时间。

学会不思考客户端时间或服务器时间,而是思考UTC。您的大多数业务逻辑,数据存储,数据交换和日志记录应在UTC中完成。可以将UTC视为一个真实时间™,而所有其他偏移量/区域仅是变化而已。

对于UTC,请使用Instant

Instant instant = Instant.now() ;  // Capture the current moment in UTC.

以标准ISO 8601格式生成表示该时刻的文本。

String output = instant.toString() ;
  

我要的是太平洋日期时间。请帮助如何获取指定时区中的日期时间对象。

您的条款(PacificMSTPST)都不是真实的时区。

Continent/Region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用2-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;  

要从UTC调整为时区,请应用ZoneId以获得ZonedDateTime

ZoneId z = ZoneId.of( "America/Edmonton" ) ;  // https://time.is/Edmonton
ZonedDateTime zdt = instant.atZone( z ) ;

并尝试在北美西海岸的时区之一。

ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;  // https://time.is/Los_Angeles
ZonedDateTime zdt = instant.atZone( z ) ;

要生成ISO 8601以外的格式的字符串,请使用DateTimeFormatter类。搜索堆栈溢出,因为已经有很多次了。


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 4 :(得分:0)

Java Date对象没有时区 - 它只代表一个时间点。

如果要将日期格式化为时区,可以在DateFormat类中进行设置。例如:

    Date date = new Date ();
    DateFormat df = DateFormat.getDateTimeInstance();
    df.setTimeZone(TimeZone.getTimeZone("PST"));
    System.out.println(df.format(date));
    df.setTimeZone(TimeZone.getTimeZone("EST"));
    System.out.println(df.format(date));

将在PST中显示时间,然后在EST中显示时间。

答案 5 :(得分:0)

最近我本人也遇到了类似的问题,并且将时区设置为区域设置对我来说效果更好(即不是EST / EDT,而是America / New_York)。我尝试过EST,然后尝试做EDT的夏令时补偿工作,事实证明这要容易得多。将您的时区设置为您想要的任何时区,然后使用Date对象创建一个新日期,它将用于该时区。然后,您可以根据需要使用format方法获取时间戳。

TimeZone.setDefault(TimeZone.getTimeZone("America/New_York"));
Date date = new Date();
timeStamp = date.format('yyyy-MM-dd HH:mm:ss.SSSZ');
System.out.println(timeStamp);

返回

"2019-07-25 17:09:23:626-0400"