Java 如何在特定日期设置时区?
我有一个问题,我尝试了所有方法(包括在线stackoverflow线程),但无法在特定日期设置预期的时区。 这是我的密码: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");
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
类转换为legacy类Instant
。谢谢Basil!您是最棒的!请检查这就是为什么你会说那是谎言?它只是试图用对公众有意义的东西来表达那个日期reader@njzk2java.util.date
值是UTC中的一个时刻。当您报告处于特定时区时,您会产生一种错觉,认为在Date
中存储了一个时区,而实际上没有†。I如果你在加拿大CAD中存入了一笔钱,而没有任何要求的话,你可以将日元的金额调整成日元,我相信任何金融机构都会认为这是谎话。(†实际上,Date
中有一个时区,但没有getter/setter,也不影响Date
,但影响toString
等等,这使得这个类更加混乱。)equals