我有类似于这个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.588Date是适当的,但时间不同。我试过将时区设置为"UTC“,但没有帮助。
请注意:在Java 8中,它可以很好地与其他库一起工作,比如Instant和我们想要的Java 7。
发布于 2017-09-19 12:53:00
您正在df1中调用df1,但此格式化程序仅用于解析,在格式化中不会产生任何影响。
要将日期格式化为特定的时区,必须在其他格式化程序中设置它(如果不设置,格式化程序将使用JVM默认时区)。另外,您不需要依赖另一个类,比如FastDateFormat,您可以简单地使用另一个SimpleDateFormat。
但是要获得完全相同的日期/时间,您需要使用输入(+01:00)中使用的相同偏移量。Date对象不要保留这些信息,因此必须从输入中提取它。一种方法是使用substring
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);产出如下:
timeStamp : 1480062550588 AfterConverting : 2016-11-25 09:29:10.588
如果您想继续使用FastDateFormat,也可以在其中设置时区:
FastDateFormat f = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSS", TimeZone.getTimeZone("GMT" + offset));
String eventTime = f.format(timeStamp);Java新日期/时间API
旧类(Date、Calendar和SimpleDateFormat)具有很多问题和设计问题,它们正在被新的API所取代。
对于Java 7,您可以使用ThreeTen Backport,这是Java8的新日期/时间类的一个很好的后端。对于Android,您还需要ThreeTenABP (更多关于如何使用这里)。
这样,您就可以将输入解析为org.threeten.bp.OffsetDateTime,并使用org.threeten.bp.format.DateTimeFormatter作为输出。在本例中,OffsetDateTime保存偏移量信息,因此不需要在格式化程序中设置它:
OffsetDateTime odt = OffsetDateTime.parse(string1);
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
System.out.println("timeStamp : " + odt.toInstant().toEpochMilli());
System.out.println("AfterConverting : " + odt.format(fmt));输出是相同的:
timeStamp : 1480062550588 AfterConverting : 2016-11-25 09:29:10.588
https://stackoverflow.com/questions/46300515
复制相似问题