java.time
建议该页面的未来访问者使用 java.time API。 java.util 的日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,转用modern date-time API。
当地时间:
import java.time.LocalTime;
import java.time.ZoneId;
public class Main {
public static void main(String[] args) {
// ZoneId.systemDefault() returns the time-zone of JVM. Change it as per your
// requirement e.g. to ZoneId.of("Europe/London")
LocalTime localTimeNow = LocalTime.now(ZoneId.systemDefault());
System.out.println(localTimeNow);
// After 5 seconds
LocalTime localTimeAfter5Sec = localTimeNow.plusSeconds(5);
System.out.println(localTimeAfter5Sec);
}
}
本地日期和时间:
import java.time.LocalDateTime;
import java.time.ZoneId;
public class Main {
public static void main(String[] args) {
// ZoneId.systemDefault() returns the time-zone of JVM. Change it as per your
// requirement e.g. to ZoneId.of("Europe/London")
LocalDateTime ldtNow = LocalDateTime.now(ZoneId.systemDefault());
System.out.println(ldtNow);
// After 5 seconds
LocalDateTime ldtAfter5Sec = ldtNow.plusSeconds(5);
System.out.println(ldtAfter5Sec);
}
}
带有时区的日期和时间:
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
// ZoneId.systemDefault() returns the time-zone of JVM. Change it as per your
// requirement e.g. to ZoneId.of("Europe/London")
ZonedDateTime zdtNow = ZonedDateTime.now(ZoneId.systemDefault());
System.out.println(zdtNow);
// After 5 seconds
ZonedDateTime zdtAfter5Sec = zdtNow.plusSeconds(5);
System.out.println(zdtAfter5Sec);
}
}
时间线上的瞬时点:
java.time.Instant 模拟时间线上的单个瞬时点并且独立于时区。它是最常用的函数,toEpochMilli 和 ofEpochMilli 用于将时刻转换为从 1970-01-01T00:00:00Z 开始的毫秒数,以及从 1970-01-01T00 开始的毫秒数: 00:00Z 分别到瞬间。注意Z代表Zulu,代表UTC+00:00。
import java.time.Instant;
public class Main {
public static void main(String[] args) {
// This moment
Instant now = Instant.now();
System.out.println(now);
// Moment after 5 sec
Instant momentAfter5Sec = now.plusSeconds(5);
System.out.println(momentAfter5Sec);
}
}
从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。
乔达时间
摘自Home Page of Joda-Time
Joda-Time 是 Java 的事实上的标准日期和时间库
在 Java SE 8 之前。现在要求用户迁移到 java.time
(JSR-310)。
当地时间:
import org.joda.time.DateTimeZone;
import org.joda.time.LocalTime;
public class Main {
public static void main(String[] args) {
// DateTimeZone.getDefault() returns the time-zone of JVM. Change it as per your
// requirement e.g. to DateTimeZone.forID("Europe/London")
LocalTime localTimeNow = LocalTime.now(DateTimeZone.getDefault());
System.out.println(localTimeNow);
// After 5 seconds
LocalTime localTimeAfter5Sec = localTimeNow.plusSeconds(5);
System.out.println(localTimeAfter5Sec);
}
}
本地日期和时间:
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDateTime;
public class Main {
public static void main(String[] args) {
// DateTimeZone.getDefault() returns the time-zone of JVM. Change it as per your
// requirement e.g. to DateTimeZone.forID("Europe/London")
LocalDateTime ldtNow = LocalDateTime.now(DateTimeZone.getDefault());
System.out.println(ldtNow);
// After 5 seconds
LocalDateTime ldtAfter5Sec = ldtNow.plusSeconds(5);
System.out.println(ldtAfter5Sec);
}
}
带有时区的日期和时间:
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
public class Main {
public static void main(String[] args) {
// DateTimeZone.getDefault() returns the time-zone of JVM. Change it as per your
// requirement e.g. to DateTimeZone.forID("Europe/London")
DateTime dtNow = new DateTime(DateTimeZone.getDefault());
System.out.println(dtNow);
// After 5 seconds
DateTime dtAfter5Sec = dtNow.plusSeconds(5);
System.out.println(dtAfter5Sec);
}
}
时间线上的瞬时点:
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
public class Main {
public static void main(String[] args) {
DateTime now = new DateTime(DateTimeZone.UTC);
System.out.println(now);
// After 5 seconds
DateTime after5Sec = now.plusSeconds(5);
System.out.println(after5Sec);
}
}
旧版 API:
java.util.Date 对象不像modern date-time types 那样是真正的日期时间对象;相反,它表示距离Epoch of January 1, 1970 的毫秒数。当你打印一个java.util.Date 的对象时,它的toString 方法返回从这个毫秒值计算的日期时间。由于java.util.Date 没有时区信息,它会应用您的JVM 的时区并显示相同的信息。如果您需要在不同的时区打印日期时间,则需要将时区设置为SimpleDateFomrat 并从中获取格式化字符串。
import java.util.Calendar;
public class Main {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());
calendar.add(Calendar.SECOND, 5);// -5 if you want to subtract
System.out.println(calendar.getTime());
}
}
java.time.Instant 作为传统 API 和现代 API 之间的桥梁:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Calendar;
import java.util.Date;
public class Main {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
Instant instant = date.toInstant();
// Now you can convert instant to other types of java.time e.g.
ZonedDateTime zdt = instant.atZone(ZoneId.of("Asia/Dubai"));
System.out.println(zdt);
}
}
无论出于何种目的,如果您想将instant 转换为java.util.Date 的对象:
Date dateTime = Date.from(instant);