首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java setTimeZone更改日期

Java setTimeZone更改日期
EN

Stack Overflow用户
提问于 2019-10-23 15:08:38
回答 2查看 375关注 0票数 0

我正在将一个字符串"11/15/2020“解析为一个日期。我需要将时区设置为EDT,但这将更改为11/14/2020。我假设,因为我在科技委,它将消除这个时差:太阳,11月15日,00:00:00,2020年,这将成为前一天。

我想在不修改日期的情况下设置时区。我该怎么做呢?仅仅增加一个小时是不够的。

代码语言:javascript
运行
复制
dateFormat dataFormat = new SimpleDateFormat("MM/dd/yy");
dataFormat.setTimeZone(TimeZone.getTimeZone(Constants.EDT_TZN));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-23 20:13:41

日期没有时区

我想在不修改日期的情况下设置时区。

只有日期的价值,如2020年的11月15日,没有时区的概念。你没必要担心时区。

避免遗留日期-时间类

您正在使用几年前被JSR 310中定义的java.time类取代的糟糕的日期时间类。不要使用SimpleDateFormatDateCalendar

LocalDate

在Java中,只有日期的值没有一天的时间,没有一天的时间是由LocalDate类表示的.

代码语言:javascript
运行
复制
String input = "11/15/2020" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu" ) ;
LocalDate ld = LocalDate.parse( input , f ) ;

看这个在IdeOne.com现场运行的代码

ld.toString: 2020年-11-15

力矩

也许你想要的是片刻而不是约会。我想那意味着你想要一天中的第一分钟。

不要以为一天从00:00开始。日照节约时间(DST)等异常意味着一天可能从01:00:00这样的时间开始。让java.time确定特定时区中特定的一天是从什么开始的。

Continent/Region格式指定Continent/Region,如America/MontrealAfrica/CasablancaPacific/Auckland。不要使用2-4个字母的缩写,如ESTEDTCSTIST,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)。例如,CST可能是中国标准时间,就像美洲的中央标准时间一样容易。

代码语言:javascript
运行
复制
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;

zdt.toString():2020-11-15T00:00-05:00美国/蒙特利尔

通常最好的存储和交换时间在协调世界时。若要从指定的时区调整到UTC,请从Instant中提取ZonedDateTime。根据定义,Instant总是在UTC中。

代码语言:javascript
运行
复制
Instant instant = zdt.toInstant() ;

instant.toString():2020-11-15T05:00:00Z

生成标准ISO 8601格式的文本。结尾的Z表示UTC,发音为“Zulu”。

instant.toString():2020-11-15T05:00:00Z

转换

如果您必须与尚未更新为java.time的旧代码进行互操作,则可以来回转换。查看添加到旧类中的新to…/from…方法。

遗留类Date虽然名称错误,但等同于Instant,两者都代表了UTC的一个时刻。Instant使用更好的纳秒分辨率,而不是毫秒。

代码语言:javascript
运行
复制
Date d = java.util.Date.from( instant ) ;

…和…

代码语言:javascript
运行
复制
Instant instant = d.toInstant() ;

请注意,应用当前默认时区的Date::toString 方法告诉lie。虽然用意良好,但在实践中这是相当令人困惑的。避免这门课的许多原因之一。

票数 2
EN

Stack Overflow用户

发布于 2019-10-23 15:20:49

Java中的时间(根据Date对象和System.currentTimeMillis)被定义为在1970年1月1日0:00:00格林尼治时间之后的毫秒。TimeZone所做的所有设置都是在特定时间(Java)以小时为单位来本地化偏移量。

所以你有三个选择:

  1. 不要添加额外的小时,并将时区设置为EST,在这种情况下,您将得到一个新的日期。
  2. 加上额外的小时,在这种情况下,日期将保持不变。
  3. 查找或构建您自己的时间/日期包
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58525950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档