我正在将一个长数字从服务器转换为本地日期时间。服务器时区为GMT,我们正在转换为本地日期时间。
我的问题是有什么简单的方法可以做到这一点,因为我很确定下面的代码在一定程度上占用了CPU。任何代码较少的简单方法,如加法或减法,都会很棒。
我的代码-Java代码转换时区
Long update_time = System.currentTimeMillis();
Date date = new Date(update_time);
Format format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
ZonedDateTime dateTime = ZonedDateTime.parse( format.format(date) + " GMT", formatter);
ZoneId zone = ZoneId.of("Asia/Kolkata");
ZoneId zone1 = ZoneId.systemDefault();
ZonedDateTime dt1 = dateTime.withZoneSameInstant(zone);
//ZonedDateTime utc = ZonedDateTime.parse( format.format(date) );
System.out.println("Original time: " + format.format(date));
System.out.println("Parsed time: " + dateTime.format(formatter) );
System.out.println("Local time: " + dt1.format(formatter) );
我不知道为什么要混合传统的API和现代的API。
java.util
日期-时间API及其格式API、SimpleDateFormat
已过时且存在错误。建议完全停止使用它们,并切换到现代日期时间API*。
使用现代日期时间APIjava.time
的演示:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
Instant now = Instant.now();
ZonedDateTime zdt = now.atZone(ZoneId.of("Asia/Kolkata"));
System.out.println(zdt);
}
}
输出:
2021-06-07T21:47:30.271351+05:30[Asia/Kolkata]
在线演示
*出于任何原因,如果您必须坚持使用Java 6或Java 7,您可以使用ThreeTen Backport将Java.time的大部分功能向后移植到Java 6&7.如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查通过desugaring和如何在Android项目中使用ThreeTenABP提供的Java 8+API
我可以在下面的代码中得到时差
除非用户更改了他们很少做的系统时区,否则我会简单地通过添加或减去我从服务器上得到的原始长数字来计算本地时间。我可以偶尔检查一下。
这种简单的加法/减法节省了大量的CPU时间。
好吧,我希望我能很容易地将代码转换为java.time.*,但稍后会尝试
代码链接
Long update_time = System.currentTimeMillis();
Date date = new Date(update_time);
Format format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS z");
DateTimeFormatter f1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
ZonedDateTime dateTime = ZonedDateTime.parse( format.format(date) + " GMT", formatter);
ZoneId zone = ZoneId.of("Asia/Kolkata");
ZoneId zone1 = ZoneId.systemDefault();
ZonedDateTime dt1 = dateTime.withZoneSameInstant(zone);
//ZonedDateTime utc = ZonedDateTime.parse( format.format(date) );
System.out.println("Original time: " + format.format(date));
System.out.println("Parsed time: " + dateTime.format(formatter) );
System.out.println("Local time: " + dt1.format(formatter) );
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
try {
Date d = (Date)f.parse(dt1.format(f1));
System.out.println("Long time: " + d.getTime() );
System.out.println("System time: " + update_time );
System.out.println("Time Difference: " + (d.getTime() - update_time) ); // this remains the same if local timezone is not changed
} catch(Exception e) { System.out.println("Exception: " + e.toString() ); }