日期时间对象应该存储有关日期、时间、时区等的信息,而不是有关格式的信息。您可以String
使用日期时间格式化 API 将日期时间对象格式化为您选择的模式。
- 现代日期时间类型的日期时间格式化 API 在包中,
java.time.format
例如java.time.format.DateTimeFormatter
,java.time.format.DateTimeFormatterBuilder
等。
- 旧日期时间类型的日期时间格式化 API 位于包中,
java.text
例如java.text.SimpleDateFormat
等java.text.DateFormat
。
使用现代 API 的演示:
import java.time.LocalDate;
import java.time.Month;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
ZonedDateTime zdt = ZonedDateTime.of(LocalDate.of(2012, Month.DECEMBER, 1).atStartOfDay(),
ZoneId.of("Europe/London"));
// Default format returned by Date#toString
System.out.println(zdt);
// Custom format
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH);
String formattedDate = dtf.format(zdt);
System.out.println(formattedDate);
}
}
输出:
2012-12-01T00:00Z[Europe/London]
2012-12-01
从Trail: Date Time了解现代日期时间 API 。
使用旧版 API 的演示:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
public class Main {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
calendar.setTimeInMillis(0);
calendar.set(Calendar.YEAR, 2012);
calendar.set(Calendar.MONTH, 11);
calendar.set(Calendar.DAY_OF_MONTH, 1);
Date date = calendar.getTime();
// Default format returned by Date#toString
System.out.println(date);
// Custom format
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
String formattedDate = sdf.format(date);
System.out.println(formattedDate);
}
}
输出:
Sat Dec 01 00:00:00 GMT 2012
2012-12-01
一些更重要的点:
- 该
java.util.Date
对象不是像现代日期时间类型那样的真实日期时间对象;相反,它表示从Epoch of January 1, 1970
. 当你打印一个 的对象时java.util.Date
,它的toString
方法返回从这个毫秒值计算出来的日期时间。由于java.util.Date
没有时区信息,它会应用 JVM 的时区并显示相同的信息。如果您需要在不同的时区打印日期时间,则需要将时区设置为SimpleDateFomrat
并从中获取格式化字符串。
- 日期时间 API
java.util
及其格式化 APISimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到现代日期时间 API。