我有这样的日期格式2016-11-25T09:29:10.588+01:00
我想将此转换为milliseconds
,稍后在打印时我必须再次将毫秒转换为“yyyy-MM-dd HH:mm:ss.SSS
”这种格式。
static FastDateFormat alarmDateFormat = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSS");
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSXXX");
df1.setTimeZone(TimeZone.getTimeZone("UTC"));
String string1 = "2016-11-25T09:29:10.588+01:00";
Date result1 = df1.parse(string1);
long timeStamp = result1.getTime();
System.out.println("timeStamp : " +timeStamp);
String eventTime = alarmDateFormat.format(timeStamp);
System.out.println("AfterConverting : " + eventTime);
结果:
timeStamp : 1480062550588
AfterConverting : 2016-11-25 13:59:10.588
Date
是正确的,但时间不同。我已经尝试将时区设置为“UTC”,但它没有帮助。
请注意:在Java 8中,它可以与其他库(如Instant)以及Java 7中的所有库一起使用。
答案 0 :(得分:4)
您正在ROW_NUMBER
中调用setTimeZone
,但此格式化程序仅用于解析,并且不会对格式化产生任何影响。
要将日期格式化为特定时区,您必须在另一个格式化程序中设置它(如果您未设置,格式化程序将使用JVM默认时区)。此外,您不需要依赖其他课程,例如df1
,您只需使用其他课程FastDateFormat
。
但要获得完全相同的日期/时间,您需要使用输入中使用的相同偏移量(SimpleDateFormat
)。 +01:00
个对象don't keep this information,因此您必须从输入中提取它。一种方法是使用Date
:
substring
输出将是:
timeStamp:1480062550588
AfterConverting:2016-11-25 09:29:10.588
如果您想继续使用SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSXXX");
String string1 = "2016-11-25T09:29:10.588+01:00";
Date result1 = df1.parse(string1);
long timeStamp = result1.getTime();
System.out.println("timeStamp : " + timeStamp);
// extract the +01:00 offset from the input
String offset = string1.substring(23);
SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
// set the offset in the formatter (so output is converted to it)
df2.setTimeZone(TimeZone.getTimeZone("GMT" + offset));
String eventTime = df2.format(timeStamp);
System.out.println("AfterConverting : " + eventTime);
,也可以在其中设置时区:
FastDateFormat
旧类(FastDateFormat f = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSS", TimeZone.getTimeZone("GMT" + offset));
String eventTime = f.format(timeStamp);
,Date
和Calendar
)有lots of problems和design issues,并且它们被新API取代
对于 Java 7 ,您可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。对于 Android ,您还需要ThreeTenABP(更多关于如何使用它here)。
使用此功能,您可以将输入解析为SimpleDateFormat
并使用org.threeten.bp.OffsetDateTime
作为输出。在这种情况下,org.threeten.bp.format.DateTimeFormatter
会保留偏移量信息,因此您无需在格式化程序中设置它:
OffsetDateTime
输出相同:
timeStamp:1480062550588
AfterConverting:2016-11-25 09:29:10.588