如何java.util.Date
用DateTimeFormatter
便携式格式化?
我无法使用
Date in = readMyDateFrom3rdPartySource();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
ldt.format(dateTimeFormatter);
因为我担心使用 ofZoneId.systemDefault()
会带来一些变化。
我需要完全格式化我拥有的那个对象。
更新
注意:时间就是时间。不是空间。时区是非常粗略的经度度量,即空间。我不需要它。只有时间(和日期)。
更新 2
我编写了以下程序,证明它Date
不仅包含正确的“即时”:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DataNature2 {
public static void main(String[] args) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateTimeString = "1970-01-01 00:00:01";
Date date = simpleDateFormat.parse(dateTimeString);
System.out.println("1 second = " + date.getTime());
}
}
输出如下:
1 second = -10799000
虽然它应该是
1 second = 1000
如果Date
是“即时”。
数字10799000
是3*60*60*1000-1000
- 我当地时间的时区偏移量。
这意味着,Date
该类是双重的。它的毫秒部分可能会相对于hh mm ss
部分偏移时区偏移。
这意味着,如果任何实用程序Date
根据其部件 () 返回对象,hh mm ss
则它会隐式转换为本地时间。并且getTime()
同时意味着不同的时间。我的意思是在不同的机器上,如果这个程序同时运行,getTime()
将是相同的,而时间部分将是不同的。
因此,开头的代码示例是正确的:它采用 的“即时”部分Date
,并提供系统时区部分,该部分在Date
. 即它将对偶Date
对象转换为LocalDateTime
具有相同部分的显式对象。因此,之后的格式是正确的。
更新 3
活动更有趣:
Date date = new Date(70, 0, 1, 0, 0, 1);
assertEquals(1000, date.getTime());
这个测试失败了。
UDPATE 4
新代码。献给所有信徒。
public class DataNature3 {
public static class TZ extends java.util.TimeZone {
private int offsetMillis;
public TZ(int offsetHours) {
this.offsetMillis = offsetHours * 60 * 60 * 1000;
}
@Override
public int getOffset(int era, int year, int month, int day, int dayOfWeek, int milliseconds) {
throw new UnsupportedOperationException();
}
@Override
public void setRawOffset(int offsetMillis) {
this.offsetMillis = offsetMillis;
}
@Override
public int getRawOffset() {
return offsetMillis;
}
@Override
public boolean useDaylightTime() {
return false;
}
@Override
public boolean inDaylightTime(Date date) {
return false;
}
}
public static void main(String[] args) {
Date date = new Date(0);
for(int i=0; i<10; ++i) {
TimeZone.setDefault(new TZ(i));
if( i<5 ) {
System.out.println("I am date, I am an instant, I am immutable, my hours property is " + date.getHours() + ", Amen!");
}
else {
System.out.println("WTF!? My hours property is now " + date.getHours() + " and changing! But I AM AN INSTANT! I AM IMMUTABLE!");
}
}
System.out.println("Oh, please, don't do that, this is deprecated!");
}
}
输出:
I am date, I am an instant, I am immutable, my hours property is 0, Amen!
I am date, I am an instant, I am immutable, my hours property is 1, Amen!
I am date, I am an instant, I am immutable, my hours property is 2, Amen!
I am date, I am an instant, I am immutable, my hours property is 3, Amen!
I am date, I am an instant, I am immutable, my hours property is 4, Amen!
WTF!? My hours property is now 5 and changing! But I AM AN INSTANT! I AM IMMUTABLE!
WTF!? My hours property is now 6 and changing! But I AM AN INSTANT! I AM IMMUTABLE!
WTF!? My hours property is now 7 and changing! But I AM AN INSTANT! I AM IMMUTABLE!
WTF!? My hours property is now 8 and changing! But I AM AN INSTANT! I AM IMMUTABLE!
WTF!? My hours property is now 9 and changing! But I AM AN INSTANT! I AM IMMUTABLE!
Oh, please, don't do that, this is deprecated!