现在我看到Date
和SimpleDateFormat
心理就是慌的,哈哈哈,不过能写出来用这个也行。但你也提到你自己没跑过,一般来说,时区,时间之类的,用Java8
新的时间API
处理起来相对而言要简单一些吧。
一般过程是这样:
在Java8
的时间API
中,偏移量表示时区的是ZoneOffset
,一般根据偏移的小时来初始化的,例如
ZoneOffset zoneOffset = ZoneOffset.ofHours(5);
ZoneOffset zoneOffset1 = ZoneOffset.ofHours(-5);
因为这已经是时区偏移量了,然后用上面的zoneOffset
结合专门表示偏移量时间的类OffsetDateTime
就可以获取到当前在该时区偏移量的偏移量时间
OffsetDateTime offsetDateTime = OffsetDateTime.now(zoneOffset)
OffsetDateTime
的toString()
方法就可以看出来,后面是带有偏移量
2020-08-23T05:43:40.018-05:00
而Java8
中表示本地时间的是LocalDateTime
,我们用OffsetDateTime
是可以直接转换成LocalDateTime
的
LocalDateTime localDateTime = offsetDateTime.toLocalDateTime();
然后根据LocalDateTime
就可以格式化成你想要的样子
String formatLocalDateTime = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
所以只要我们可以拿到ZoneOffset
,其实后面的代码是水到渠成的,奈何题主提到前面的小时是一个float
,那这需要我们把float
中不足一小时的提取出来,然后换一个方式来初始化ZoneOffset
,也就是ZoneOffset
的of(String offsetId)
方法,在其方法注释中我们就可以看到,它支持时分秒字符串传入的,因此我们只需要把题主的参数timeZoneOffset
转换成时分秒即可
而在Java8
中,时间API
里表示时分秒的类是LocalTime
,该类的静态方法ofSecondOfDay
是可以根据一天之内的秒数初始化的,因此我们只需要把timeZoneOffset
转换成秒,然后初始化成LocalTime
即可,而LocalTime
的toString
方法恰好就是hh:mm:ss
,我们只要之前把参数timeZoneOffset
的符号保留下来即可,因此完整代码如下:
public static String getFormatedDateString(float timeZoneOffset){
String prefix = "+";
if (timeZoneOffset < 0) {
prefix = "-";
timeZoneOffset = 0 - timeZoneOffset;
}
long seconds = (long) (ChronoUnit.HOURS.getDuration().getSeconds() * timeZoneOffset);
ZoneOffset zoneOffset = ZoneOffset.of(prefix + LocalTime.ofSecondOfDay(seconds).toString());
String formatLocalDateTime = OffsetDateTime.now(zoneOffset)
.toLocalDateTime()
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
return formatLocalDateTime;
}
当然其中DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
可以在外面写成final static
可能更好,毕竟是一个常量般存在,不必每次初始化一个DateTimeFormatter
试试看看达到题主的效果没,如果没有达到,当我打脸,哈哈哈哈,不过还是要告诉我,我好做哈修改!Σ(っ °Д °;)っ
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…