Java 如何在特定日期设置时区?

Java 如何在特定日期设置时区?,java,android,date,datetime,simpledateformat,Java,Android,Date,Datetime,Simpledateformat,我有一个问题,我尝试了所有方法(包括在线stackoverflow线程),但无法在特定日期设置预期的时区。 这是我的密码: Date until = DateTimeUtils.getNewBookUntilDate(); //which returns : Wed Aug 28 11:00:02 EDT 2019 SimpleDateFormat isoFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");

我有一个问题,我尝试了所有方法(包括在线stackoverflow线程),但无法在特定日期设置预期的时区。 这是我的密码:

Date until = DateTimeUtils.getNewBookUntilDate();
//which returns : Wed Aug 28 11:00:02 EDT 2019 

SimpleDateFormat isoFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
            isoFormat.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles");
try {
    until = isoFormat.parse(until.toString());
} catch (ParseException e) {
     e.printStackTrace();
}
但我仍然得到:2019年8月28日星期三美国东部时间11:00:02,而不是2019年8月28日星期三美国东部时间8:00:02

你知道怎么做吗?

避免
java.util.Date
java.util.Date
表示UTC中的一个时刻。无需将其作为文本进行操作。注意:方法
Date::toString
会说谎,在生成文本时动态应用JVM的当前默认时区

相反,使用
java.time.Instant
首先,将这个糟糕的遗留类转换为它的现代替代品,
java.time.Instant
。请注意添加到旧类中的新转换方法

Instant instant = myDate.toInstant() ;
ZoneDateTime
瞬间
也是UTC中的一个瞬间。要通过某个地区的人使用的UTC偏移量查看同一时刻,请应用
ZoneId
以获取
zoneDateTime
对象

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
要清楚:这个
zdt
对象和这个
instant
对象都代表相同的时刻,时间轴上的相同点。他们只是在墙上的时钟时间上有所不同。想象一下,有人在(总是在UTC)给魁北克的人打电话,他们都抬头看着各自墙上的时钟

从现代到传统的转变 如果您手头有一个
ZonedDateTime
对象,并且必须获得一个
java.util.Date
以便与尚未更新为java.time的旧代码进行互操作,那么您可以转换。通过从
ZonedDateTime
对象中提取
Instant
,从
Instant
转到
Date

Instant instant = zdt.toInstant() ;
java.util.Date date = java.util.Date.from ( instant ) ;
如果您需要的是
日历
而不是
日期
,则转换更直接

Calendar cal = GregorianCalendar.from( zdt ) ;

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

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

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

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

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(日期没有时区。只有当您创建一个字符串来表示它时,才会考虑它。查看您打印日期的位置。是否有其他方法可以根据当前时区检索我的日期并将其发送过来?尝试:在日历中设置时区,然后使用。看到这似乎不起作用吗伊瑟:(如果您显示要转换为字符串/打印的代码,可能会有所帮助。谢谢!我如何将zonedatetime转换为date?@AngelaHeely我在末尾添加了一个部分,介绍如何将modern
      zonedatetime
      &
      Instant
      类转换为legacy类
      java.util.date
      。谢谢Basil!您是最棒的!请检查这就是为什么你会说那是谎言?它只是试图用对公众有意义的东西来表达那个日期reader@njzk2
      Date
      值是UTC中的一个时刻。当您报告处于特定时区时,您会产生一种错觉,认为在
      Date
      中存储了一个时区,而实际上没有†。I如果你在加拿大CAD中存入了一笔钱,而没有任何要求的话,你可以将日元的金额调整成日元,我相信任何金融机构都会认为这是谎话。(†实际上,
      Date
      中有一个时区,但没有getter/setter,也不影响
      toString
      ,但影响
      equals
      等等,这使得这个类更加混乱。)