从毫秒转换为日期字符串
Convert from Millisecond to String of Date
我尝试将毫秒转换为日期字符串。然而,结果并不如我所料。
输入为毫秒(例如:1508206600485
)
我的时区是UTC +10:00
------Expected-------------------------------------------- Actual------
01:32 (PM) 17/10/2017--------------------------------02:32 (PM) 17/10/2017
这是方法
public static String getDate(long milliSeconds) {
SimpleDateFormat formatter = new SimpleDateFormat("hh:mm dd/MM/yyyy");
String dateString = formatter.format(new Date(milliSeconds));
return dateString;
}
基于@phlaxyr,我已经解决了我的问题。您可以在下面的link
中获取您的时区
http://tutorials.jenkov.com/java-date-time/java-util-timezone.html
public static String getDate(long milliSeconds) {
SimpleDateFormat formatter = new SimpleDateFormat("hh:mm dd/MM/yyyy");
formatter.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
String dateString = formatter.format(new Date(milliSeconds));
return dateString;
}
很好, I just like to add an approach with Java 8 new java.time API. The old classes (Date
, Calendar
and SimpleDateFormat
) have lots of problems and design issues,强烈建议尽可能切换到新的API。
如果您使用 Java <= 7,您可以使用 ThreeTen Backport, a great backport for Java 8's new date/time classes. And for Android, you'll also need the ThreeTenABP (more on how to use it ).
下面的代码适用于两者。
唯一的区别是包名称(在 Java 8 中是 java.time
,在 ThreeTen Backport(或 Android 的 ThreeTenABP)中是 org.threeten.bp
),但是 classes 和方法 names 相同。
要将毫秒值转换为特定时区,您可以使用 Instant
class,然后使用 ZoneId
转换为时区,创建 ZonedDateTime
.
然后你用一个DateTimeFormatter
格式化它:
// convert millis value to a timezone
Instant instant = Instant.ofEpochMilli(1508206600485L);
ZonedDateTime z = instant.atZone(ZoneId.of("Australia/Sydney"));
// format it
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("hh:mm dd/MM/yyyy");
System.out.println(fmt.format(z)); // 01:16 17/10/2017
输出为:
01:16 17/10/2017
请注意,我使用 hh
计算时间。 According to javadoc,这个字母表示 clock-hour-of-am-pm 字段(值从 1 到 12),所以没有 AM/PM 指标,它可以模棱两可。也许您想添加 AM/PM 字段(将字母 a
添加到格式模式),或将小时数更改为 HH
( 小时数 , 值从 0 到 23).
另请注意ZonedDateTime
的实际值为2017-10-17T13:16:40.485+11:00
(01:16 PM),因为在10月17日 th 2017, Sydney is in Daylight Saving Time, 所以实际偏移量是+11:00
.
我尝试将毫秒转换为日期字符串。然而,结果并不如我所料。
输入为毫秒(例如:1508206600485
)
我的时区是UTC +10:00
------Expected-------------------------------------------- Actual------
01:32 (PM) 17/10/2017--------------------------------02:32 (PM) 17/10/2017
这是方法
public static String getDate(long milliSeconds) {
SimpleDateFormat formatter = new SimpleDateFormat("hh:mm dd/MM/yyyy");
String dateString = formatter.format(new Date(milliSeconds));
return dateString;
}
基于@phlaxyr,我已经解决了我的问题。您可以在下面的link
中获取您的时区http://tutorials.jenkov.com/java-date-time/java-util-timezone.html
public static String getDate(long milliSeconds) {
SimpleDateFormat formatter = new SimpleDateFormat("hh:mm dd/MM/yyyy");
formatter.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
String dateString = formatter.format(new Date(milliSeconds));
return dateString;
}
很好Date
, Calendar
and SimpleDateFormat
) have lots of problems and design issues,强烈建议尽可能切换到新的API。
如果您使用 Java <= 7,您可以使用 ThreeTen Backport, a great backport for Java 8's new date/time classes. And for Android, you'll also need the ThreeTenABP (more on how to use it
下面的代码适用于两者。
唯一的区别是包名称(在 Java 8 中是 java.time
,在 ThreeTen Backport(或 Android 的 ThreeTenABP)中是 org.threeten.bp
),但是 classes 和方法 names 相同。
要将毫秒值转换为特定时区,您可以使用 Instant
class,然后使用 ZoneId
转换为时区,创建 ZonedDateTime
.
然后你用一个DateTimeFormatter
格式化它:
// convert millis value to a timezone
Instant instant = Instant.ofEpochMilli(1508206600485L);
ZonedDateTime z = instant.atZone(ZoneId.of("Australia/Sydney"));
// format it
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("hh:mm dd/MM/yyyy");
System.out.println(fmt.format(z)); // 01:16 17/10/2017
输出为:
01:16 17/10/2017
请注意,我使用 hh
计算时间。 According to javadoc,这个字母表示 clock-hour-of-am-pm 字段(值从 1 到 12),所以没有 AM/PM 指标,它可以模棱两可。也许您想添加 AM/PM 字段(将字母 a
添加到格式模式),或将小时数更改为 HH
( 小时数 , 值从 0 到 23).
另请注意ZonedDateTime
的实际值为2017-10-17T13:16:40.485+11:00
(01:16 PM),因为在10月17日 th 2017, Sydney is in Daylight Saving Time, 所以实际偏移量是+11:00
.