你好,我有一个方法可以在当前时间中添加一个时间。我要找的是,我想添加此代码一个本地时间信息,因为无法正确获取我所在国家的本地时间。我在stackoverflow中搜索了一下,但找不到类似的主题。我愿意接受你的建议,谢谢。
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class MyClass {
public static void main(String args[]) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.HOUR_OF_DAY, 8);
DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
System.out.println(dateFormat.format(cal.getTime()));
}
}
我用java.time实用程序更改了代码
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class MyClass {
public static void main(String args[]) {
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
LocalDateTime date = LocalDateTime.now();
System.out.println(dateFormat.format(date));
System.out.println(dateFormat.format(date.plusHours(10)));
}
}
tl;dr
ZonedDateTime
.now( ZoneId.of( "Europe/Istanbul" ) )
.plusHours( 10 )
否,不是Calendar
千万不要使用可怕的CCD_ 2&SimpleDateFormat
遗留类。
不,不是LocalDateTime
切勿拨打LocalDateTime.now
。我无法想象这样做是正确的。
LocalDateTime
类缺少时区或UTC偏移量的上下文。所以这个类不能代表一个时刻,一个时间线上的特定点。
要跟踪某个时刻,请使用:Instant
、OffsetDateTime
或ZonedDateTime
类。
ZoneId
指定您的时区。
ZoneId z = ZoneId.of( "Europe/Istanbul" ) ;
或者获取JVM的当前默认时区。
ZoneId z = ZoneId.systemDefault() ;
ZonedDateTime
获取当前时刻。
ZonedDateTime now = ZonedDateTime.now( z ) ;
添加时间。
ZonedDateTime later = now.plusHours( 10 ) ;
不幸的是,您无法真正使用时区,因为您是从操作系统中获取时区的。如果操作系统为您提供UTC,请将其配置为土耳其或在应用程序中进行更改。
既然你知道自己的位置,就这样做:
LocalDateTime date = LocalDateTime.now((ZoneId.of("Europe/Istanbul"));
下面的这个问题可能会有所帮助:如何获取基于土耳其时区的Calendar.getInstance((
您还可以使用互联网提供商推断您的时区。下面有两个例子。
时区示例1
RestTemplate restTemplate = new RestTemplate();
String timezone = restTemplate.getForObject("https://ipapi.co/timezone", String.class);
时区示例2
String timezone = restTemplate.getForObject("http://ip-api.com/line?fields=timezone", String.class);
获取时区后:
LocalDateTime date = LocalDateTime.now(ZoneId.of(timezone));