此类也继承了 java.util.Date,包含的信息有年月日时分秒纳秒,是的,它还扩展了纳秒,一个使用示例如下:
long time = System.currentTimeMillis(); java.sql.Timestamp timestamp = new java.sql.Timestamp(time); timestamp.setNanos(123456); int nanos = timestamp.getNanos(); // nanos = 123456 java.util.Calendar 和 GregorianCalendarCalendar 抽象类用于执行日期和时间换算,无法使用构造器实例化它,原因是世界上有不止一个日历。
但是其提供了一个 getInstance() 方法,可以获取对应当前时间的 Calendar 对象:
getInstance() 方法底层是如下这样实现的:
public static Calendar getInstance() { return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT)); }没错,很容易想到,此方法还有重载的,可以提供部分指定初始化参数的版本,如下:
getInstance(TimeZone zone); getInstance(Locale aLocale); getInstance(TimeZone zone, Locale aLocale);此外,一般可以通过其子类 GregorianCalendar 来访问日期时间信息,一个例子如下:
Calendar calendar = new GregorianCalendar(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // 一月 Jan = 0, 不是 1 int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR); int weekOfMonth= calendar.get(Calendar.WEEK_OF_MONTH); int hour = calendar.get(Calendar.HOUR); // 12 小时制 int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY); // 24 小时制 int minute = calendar.get(Calendar.MINUTE); int second = calendar.get(Calendar.SECOND); int millisecond= calendar.get(Calendar.MILLISECOND); calendar.set(Calendar.YEAR, 2018); calendar.set(Calendar.MONTH, 11); // 11 = december,十二月 calendar.set(Calendar.DAY_OF_MONTH, 24); // 圣诞节 年月日等的加减 Calendar calendar = new GregorianCalendar(); // 加 1 天 calendar.add(Calendar.DAY_OF_MONTH, 1); // 当第二个参数为负数时,表示减,下面就是减 1 天 calendar.add(Calendar.DAY_OF_MONTH, -1); Calendar/Date/String 的互相转换 // Calendar to Date Calendar calendar = Calendar.getInstance(); java.util.Date date = calendar.getTime(); // Date to Calendar calendar.setTime(new java.util.Date()); // Calendar to String Calendar calendat = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String dateStr = sdf.format(calendar.getTime()); // String to Calendar String str = "2018-12-3"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse(str); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); // Date to String SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String dateStr = sdf.format(new Date()); // String to Date String str = "2018-12-3"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date dateParse = sdf.parse(str); Calendar 容易犯错的地方Calendar 类的 MONTH 字段不是往常的从 1 到 12 。而是从 0 到 11 ,其中 0 是一月,11 是十二月。
一周的某一天是从 1 到 7 表示,这点不出意料,但是一周的第一天是星期日而不是星期一,这意味着 1 =星期日,2 =星期一,7 =星期六。
如果需要进行复杂的日期和时间计算,最好在官方JavaDoc中阅读java.util.Calendar的类文档。 类文档包含有关类的特定行为的更多详细信息。 例如,如果将日期设置为 2018 年 1 月 34 日,那么实际日期是什么?
java.util.TimeZoneTimeZone 是一个表示时区的类,在跨时区执行日历计算时非常有用,一般和 Calendar 一起使用。
注意:在 Java 8 日期时间 API 中,时区由 java.time.ZoneId 类表示。 如果使用的是 Java 8 日期时间类(如 ZonedDateTime 类)的话,则只需要使用 ZoneId 类就行了。 如果使用的是 Calendar (来自Java 7和更早的日期时间API),那么仍然可以使用 java.util.TimeZone 类。
从 Calendar 中获取TimeZone Calendar calendar = new GregorianCalendar(); // 从 Calendar 获取时区 TimeZone timeZone = calendar.getTimeZone(); // 为 Calendar 设置时区 calendar.setTimeZone(timeZone); 创建 TimeZone 对象 // 获取默认时区对象 TimeZone timeZone = TimeZone.getDefault(); // 获取指定时区对象 TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai"); TimeZone timeZone = TimeZone.getTimeZone("Europe/Copenhagen");TimeZone.getTimeZone() 方法的参数可以是一个 zone ID ,可以查看 JavaDoc 获取全部 ID 。
注意:如果 getTimeZone(String zoneID);方法的 zoneID 设置错误(不匹配系统支持的任意值),比如 "Asiannn/Shanghai",那也不会抛出任何异常,而是默默地设置 zoneID 为 GMT0 ,即格林威治时间。
时区的名称、ID和偏移量