我正在将一个字符串"11/15/2020“解析为一个日期。我需要将时区设置为EDT,但这将更改为11/14/2020。我假设,因为我在科技委,它将消除这个时差:太阳,11月15日,00:00:00,2020年,这将成为前一天。
我想在不修改日期的情况下设置时区。我该怎么做呢?仅仅增加一个小时是不够的。
dateFormat dataFormat = new SimpleDateFormat("MM/dd/yy");
dataFormat.setTimeZone(TimeZone.getTimeZone(Constants.EDT_TZN));
发布于 2019-10-23 20:13:41
日期没有时区
我想在不修改日期的情况下设置时区。
只有日期的价值,如2020年的11月15日,没有时区的概念。你没必要担心时区。
避免遗留日期-时间类
您正在使用几年前被JSR 310中定义的java.time类取代的糟糕的日期时间类。不要使用SimpleDateFormat
、Date
或Calendar
。
LocalDate
在Java中,只有日期的值没有一天的时间,没有一天的时间是由LocalDate
类表示的.
String input = "11/15/2020" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu" ) ;
LocalDate ld = LocalDate.parse( input , f ) ;
ld.toString: 2020年-11-15
力矩
也许你想要的是片刻而不是约会。我想那意味着你想要一天中的第一分钟。
不要以为一天从00:00开始。日照节约时间(DST)等异常意味着一天可能从01:00:00这样的时间开始。让java.time确定特定时区中特定的一天是从什么开始的。
以Continent/Region
格式指定Continent/Region
,如America/Montreal
、Africa/Casablanca
或Pacific/Auckland
。不要使用2-4个字母的缩写,如EST
、EDT
、CST
或IST
,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)。例如,CST
可能是中国标准时间,就像美洲的中央标准时间一样容易。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
zdt.toString():2020-11-15T00:00-05:00美国/蒙特利尔
通常最好的存储和交换时间在协调世界时。若要从指定的时区调整到UTC,请从Instant
中提取ZonedDateTime
。根据定义,Instant
总是在UTC中。
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
使用更好的纳秒分辨率,而不是毫秒。
Date d = java.util.Date.from( instant ) ;
…和…
Instant instant = d.toInstant() ;
请注意,应用当前默认时区的Date::toString
方法告诉lie。虽然用意良好,但在实践中这是相当令人困惑的。避免这门课的许多原因之一。
发布于 2019-10-23 15:20:49
Java中的时间(根据Date对象和System.currentTimeMillis)被定义为在1970年1月1日0:00:00格林尼治时间之后的毫秒。TimeZone所做的所有设置都是在特定时间(Java)以小时为单位来本地化偏移量。
所以你有三个选择:
https://stackoverflow.com/questions/58525950
复制相似问题