Java 教程
- Java - 首页
- Java - 概述
- Java - 历史
- Java - 特性
- Java 与 C++
- JVM - Java 虚拟机
- Java - JDK 与 JRE 与 JVM
- Java - Hello World 程序
- Java - 环境设置
- Java - 基本语法
- Java - 变量类型
- Java - 数据类型
- Java - 类型转换
- Java - Unicode 系统
- Java - 基本运算符
- Java - 注释
- Java - 用户输入
- Java - 日期和时间
Java 控制语句
- Java - 循环控制
- Java - 决策制定
- Java - if-else
- Java - switch
- Java - for 循环
- Java - for-each 循环
- Java - while 循环
- Java - do-while 循环
- Java - break
- Java - continue
面向对象编程
- Java - OOPs 概念
- Java - 对象和类
- Java - 类属性
- Java - 类方法
- Java - 方法
- Java - 变量作用域
- Java - 构造函数
- Java - 访问修饰符
- Java - 继承
- Java - 聚合
- Java - 多态
- Java - 重写
- Java - 方法重载
- Java - 动态绑定
- Java - 静态绑定
- Java - 实例初始化块
- Java - 抽象
- Java - 封装
- Java - 接口
- Java - 包
- Java - 内部类
- Java - 静态类
- Java - 匿名类
- Java - 单例类
- Java - 包装类
- Java - 枚举
- Java - 枚举构造函数
- Java - 枚举字符串
Java 内置类
Java 文件处理
Java 错误和异常
- Java - 异常
- Java - try-catch 块
- Java - try-with-resources
- Java - 多重catch块
- Java - 嵌套try块
- Java - finally 块
- Java - throw 异常
- Java - 异常传播
- Java - 内置异常
- Java - 自定义异常
Java 多线程
- Java - 多线程
- Java - 线程生命周期
- Java - 创建线程
- Java - 启动线程
- Java - 合并线程
- Java - 线程命名
- Java - 线程调度器
- Java - 线程池
- Java - 主线程
- Java - 线程优先级
- Java - 守护线程
- Java - 线程组
- Java - 关闭钩子
Java 同步
Java 网络编程
- Java - 网络编程
- Java - Socket 编程
- Java - URL 处理
- Java - URL 类
- Java - URLConnection 类
- Java - HttpURLConnection 类
- Java - Socket 类
- Java - 泛型
Java 集合
Java 接口
Java 数据结构
Java 集合算法
高级 Java
- Java - 命令行参数
- Java - Lambda 表达式
- Java - 发送邮件
- Java - Applet 基础
- Java - Javadoc 注释
- Java - 自动装箱和拆箱
- Java - 文件不匹配方法
- Java - REPL (JShell)
- Java - 多发行版 Jar 文件
- Java - 私有接口方法
- Java - 内部类菱形运算符
- Java - 多分辨率图像 API
- Java - 集合工厂方法
- Java - 模块系统
- Java - Nashorn JavaScript
- Java - Optional 类
- Java - 方法引用
- Java - 函数式接口
- Java - 默认方法
- Java - Base64 编码解码
- Java - switch 表达式
- Java - Teeing 收集器
- Java - 微基准测试
- Java - 文本块
- Java - 动态 CDS 归档
- Java - Z 垃圾收集器 (ZGC)
- Java - 空指针异常
- Java - 打包工具
- Java - 密封类
- Java - 记录类
- Java - 隐藏类
- Java - 模式匹配
- Java - 简洁数字格式化
- Java - 垃圾收集
- Java - JIT 编译器
Java 杂项
- Java - 递归
- Java - 正则表达式
- Java - 序列化
- Java - 字符串
- Java - Process API 改进
- Java - Stream API 改进
- Java - 增强型 @Deprecated 注解
- Java - CompletableFuture API 改进
- Java - 流
- Java - 日期时间 API
- Java 8 - 新特性
- Java 9 - 新特性
- Java 10 - 新特性
- Java 11 - 新特性
- Java 12 - 新特性
- Java 13 - 新特性
- Java 14 - 新特性
- Java 15 - 新特性
- Java 16 - 新特性
Java APIs 和框架
Java 类引用
- Java - Scanner
- Java - 数组
- Java - 字符串
- Java - Date
- Java - ArrayList
- Java - Vector
- Java - Stack
- Java - PriorityQueue
- Java - LinkedList
- Java - ArrayDeque
- Java - HashMap
- Java - LinkedHashMap
- Java - WeakHashMap
- Java - EnumMap
- Java - TreeMap
- Java - IdentityHashMap
- Java - HashSet
- Java - EnumSet
- Java - LinkedHashSet
- Java - TreeSet
- Java - BitSet
- Java - Dictionary
- Java - Hashtable
- Java - Properties
- Java - Collection
- Java - Array
Java 有用资源
Java - 日期和时间
Java 提供了可在 java.util 包 中使用的 Date 类,此类封装了当前日期和时间。
Date 类支持如下表所示的两个构造函数。
序号 | 构造函数和描述 |
---|---|
1 | Date( ) 此构造函数使用当前日期和时间初始化对象。 |
2 | Date(long millisec) 此构造函数接受一个参数,该参数等于自 1970 年 1 月 1 日午夜以来的毫秒数。 |
以下是 Date 类的其他方法。
序号 | 方法和描述 |
---|---|
1 | boolean after(Date when)
此方法测试此日期是否在指定日期之后。 |
2 | boolean before(Date when)
此方法测试此日期是否在指定日期之前。 |
3 | Object clone()
此方法返回此对象的副本。 |
4 | int compareTo(Date anotherDate)
此方法比较两个 Date 的顺序。 |
5 | boolean equals(Object obj)
此方法比较两个日期是否相等。 |
6 | static Date from(Instant instant)
此方法从 Instant 对象获取 Date 实例。 |
7 | long getTime()
此方法返回自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数,由此 Date 对象表示。 |
8 | int hashCode()
此方法返回此对象的哈希码值。 |
9 | void setTime(long time)
此方法设置此 Date 对象以表示自 1970 年 1 月 1 日 00:00:00 GMT 以来 time 毫秒的时刻。 |
10 | Instant toInstant()
此方法将此 Date 对象转换为 Instant。 |
11 | String toString()
此方法将此 Date 对象转换为以下形式的字符串。 |
获取当前日期和时间
这是一种在 Java 中获取当前日期和时间非常简单的方法。可以使用带有 toString() 方法的简单 Date 对象来打印当前日期和时间,如下所示:
示例
import java.util.Date; public class DateDemo { public static void main(String args[]) { // Instantiate a Date object Date date = new Date(); // display time and date using toString() System.out.println(date.toString()); } }
这将产生以下结果:
输出
on May 04 09:51:52 CDT 2009
日期比较
以下是比较两个日期的三种方法:
可以使用 getTime( ) 获取自 1970 年 1 月 1 日午夜以来两个对象的毫秒数,然后比较这两个值。
可以使用 before( )、after( ) 和 equals( ) 方法。例如,由于月份的第 12 天在第 18 天之前,因此 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回 true。
可以使用 compareTo( ) 方法,该方法由 Comparable 接口定义并由 Date 实现。
使用 SimpleDateFormat 进行日期格式化
SimpleDateFormat 是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。SimpleDateFormat 允许您首先为日期时间格式选择任何用户定义的模式。
示例
import java.util.*; import java.text.*; public class DateDemo { public static void main(String args[]) { Date dNow = new Date( ); SimpleDateFormat ft = new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz"); System.out.println("Current Date: " + ft.format(dNow)); } }
这将产生以下结果:
输出
Current Date: Sun 2004.07.18 at 04:14:09 PM PDT
SimpleDateFormat 格式代码
要指定时间格式,请使用时间模式字符串。在此模式中,所有 ASCII 字母都保留为模式字母,定义如下:
字符 | 描述 | 示例 |
---|---|---|
G | 纪元指示符 | 公元 |
y | 四位数年份 | 2001 |
M | 月份 | 七月或 07 |
d | 日 | 10 |
h | 小时 (1~12) | 12 |
H | 小时 (0~23) | 22 |
m | 分钟 | 30 |
s | 秒 | 55 |
S | 毫秒 | 234 |
E | 星期几 | 星期二 |
D | 一年中的第几天 | 360 |
F | 一个月中的星期几 | 2 (七月的第二个星期三) |
w | 一年中的第几周 | 40 |
W | 一个月中的第几周 | 1 |
a | 上午/下午标记 | 下午 |
k | 小时 (1~24) | 24 |
K | 小时 (0~11) | 10 |
z | 时区 | 东部标准时间 |
' | 转义文本 | 分隔符 |
" | 单引号 | ` |
使用 printf 进行日期格式化
可以使用 printf 方法非常轻松地进行日期和时间格式化。可以使用以 t 开头并以表格中的一个字母结尾的两个字母格式,如下面的代码所示。
示例
import java.util.Date; public class DateDemo { public static void main(String args[]) { // Instantiate a Date object Date date = new Date(); // display time and date String str = String.format("Current Date/Time : %tc", date ); System.out.printf(str); } }
这将产生以下结果:
输出
Current Date/Time : Sat Dec 15 16:37:57 MST 2012
如果必须多次提供日期来格式化每个部分,那就有点愚蠢了。因此,格式字符串可以指示要格式化的参数的索引。
索引必须紧跟在 % 之后,并且必须以 $ 结尾。
示例
import java.util.Date; public class DateDemo { public static void main(String args[]) { // Instantiate a Date object Date date = new Date(); // display time and date System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date); } }
这将产生以下结果:
输出
Due date: February 09, 2004
或者,可以使用 < 标志。它指示应再次使用与前面格式规范相同的参数。
示例
import java.util.Date; public class DateDemo { public static void main(String args[]) { // Instantiate a Date object Date date = new Date(); // display formatted date System.out.printf("%s %tB %<te, %<tY", "Due date:", date); } }
这将产生以下结果:
输出
Due date: February 09, 2004
日期和时间转换字符
字符 | 描述 | 示例 |
---|---|---|
c | 完整的日期和时间 | 2009年5月4日星期一 09:51:52 CDT |
F | ISO 8601 日期格式 | 2004-02-09 |
D | 美国日期格式 (月/日/年) | 02/09/2004 |
T | 24小时制时间 | 18:05:19 |
r | 12小时制时间 | 下午06:05:19 |
R | 24小时制时间,无秒 | 18:05 |
Y | 四位数年份(带前导零) | 2004 |
y | 年份的后两位数(带前导零) | 04 |
C | 年份的前两位数(带前导零) | 20 |
B | 月份全称 | 二月 |
b | 月份缩写 | Feb |
m | 两位数月份(带前导零) | 02 |
d | 两位数日期(带前导零) | 03 |
e | 两位数日期(无前导零) | 9 |
A | 星期几全称 | 星期一 |
a | 星期几缩写 | Mon |
j | 三位数一年中的第几天(带前导零) | 069 |
H | 两位数小时(带前导零),介于00和23之间 | 18 |
k | 两位数小时(无前导零),介于0和23之间 | 18 |
I | 两位数小时(带前导零),介于01和12之间 | 06 |
l | 两位数小时(无前导零),介于1和12之间 | 6 |
M | 两位数分钟(带前导零) | 05 |
S | 两位数秒(带前导零) | 19 |
L | 三位数毫秒(带前导零) | 047 |
N | 九位数纳秒(带前导零) | 047000000 |
P | 上午或下午标记(大写) | 下午 |
p | 上午或下午标记(小写) | pm |
z | RFC 822 格林尼治标准时间数值偏移 | -0800 |
Z | 时区 | PST |
s | 自1970-01-01 00:00:00 GMT以来的秒数 | 1078884319 |
Q | 自1970-01-01 00:00:00 GMT以来的毫秒数 | 1078884319047 |
还有其他与日期和时间相关的有用类。更多详情,请参考Java标准文档。
将字符串解析为日期
SimpleDateFormat 类有一些附加方法,最值得注意的是 parse(),它尝试根据给定 SimpleDateFormat 对象中存储的格式解析字符串。
示例
import java.util.*; import java.text.*; public class DateDemo { public static void main(String args[]) { SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); String input = args.length == 0 ? "1818-11-11" : args[0]; System.out.print(input + " Parses as "); Date t; try { t = ft.parse(input); System.out.println(t); } catch (ParseException e) { System.out.println("Unparseable using " + ft); } } }
上述程序的示例运行将产生以下结果:
输出
1818-11-11 Parses as Wed Nov 11 00:00:00 EST 1818
暂停一段时间
您可以暂停从一毫秒到计算机寿命的任何时间段。例如,以下程序将暂停3秒:
示例
import java.util.*; public class SleepDemo { public static void main(String args[]) { try { System.out.println(new Date( ) + "\n"); Thread.sleep(5*60*10); System.out.println(new Date( ) + "\n"); } catch (Exception e) { System.out.println("Got an exception!"); } } }
这将产生以下结果:
输出
Sun May 03 18:04:41 GMT 2009 Sun May 03 18:04:51 GMT 2009
测量经过时间
有时,您可能需要以毫秒为单位测量某个时间点。因此,让我们再次改写上面的示例:
示例
import java.util.*; public class DiffDemo { public static void main(String args[]) { try { long start = System.currentTimeMillis( ); System.out.println(new Date( ) + "\n"); Thread.sleep(5*60*10); System.out.println(new Date( ) + "\n"); long end = System.currentTimeMillis( ); long diff = end - start; System.out.println("Difference is : " + diff); } catch (Exception e) { System.out.println("Got an exception!"); } } }
这将产生以下结果:
输出
Sun May 03 18:16:51 GMT 2009 Sun May 03 18:16:57 GMT 2009 Difference is : 5993
GregorianCalendar 类
GregorianCalendar 是 Calendar 类的具体实现,它实现了您熟悉的普通格里高利历。本教程中未讨论 Calendar 类,您可以查找标准 Java 文档。
Calendar 的 getInstance() 方法返回一个 GregorianCalendar,它使用默认区域设置和时区中的当前日期和时间进行初始化。GregorianCalendar 定义了两个字段:AD 和 BC。它们代表格里高利历定义的两个纪元。
GregorianCalendar 对象还有几个构造函数:
序号 | 构造函数和描述 |
---|---|
1 | GregorianCalendar() 使用默认时区和默认区域设置中的当前时间构造默认的 GregorianCalendar。 |
2 | GregorianCalendar(int year, int month, int date) 使用默认时区和默认区域设置中设置的给定日期构造 GregorianCalendar。 |
3 | GregorianCalendar(int year, int month, int date, int hour, int minute) 使用为默认时区和默认区域设置设置的给定日期和时间构造 GregorianCalendar。 |
4 | GregorianCalendar(int year, int month, int date, int hour, int minute, int second) 使用为默认时区和默认区域设置设置的给定日期和时间构造 GregorianCalendar。 |
5 | GregorianCalendar(Locale aLocale) 基于默认时区和给定区域设置中的当前时间构造 GregorianCalendar。 |
6 | GregorianCalendar(TimeZone zone) 基于给定时区和默认区域设置中的当前时间构造 GregorianCalendar。 |
7 | GregorianCalendar(TimeZone zone, Locale aLocale) 基于给定时区和给定区域设置中的当前时间构造 GregorianCalendar。 |
以下是 GregorianCalendar 类提供的一些有用的支持方法列表:
序号 | 方法和描述 |
---|---|
1 | void add(int field, int amount) 根据日历的规则,将指定(带符号)的时间量添加到给定的时间字段。 |
2 | protected void computeFields() 将 UTC 作为毫秒转换为时间字段值。 |
3 | protected void computeTime() 覆盖 Calendar 将时间字段值转换为 UTC 作为毫秒。 |
4 | boolean equals(Object obj) 比较此 GregorianCalendar 与对象引用。 |
5 | int get(int field) 获取给定时间字段的值。 |
6 | int getActualMaximum(int field) 返回给定当前日期时此字段可能具有的最大值。 |
7 | int getActualMinimum(int field) 返回给定当前日期时此字段可能具有的最小值。 |
8 | int getGreatestMinimum(int field) 如果变化,则返回给定字段的最高最小值。 |
9 | Date getGregorianChange() 获取格里高利历更改日期。 |
10 | int getLeastMaximum(int field) 如果变化,则返回给定字段的最低最大值。 |
11 | int getMaximum(int field) 返回给定字段的最大值。 |
12 | Date getTime() 获取此日历的当前时间。 |
13 | long getTimeInMillis() 获取此日历的当前时间(长整型)。 |
14 | TimeZone getTimeZone() 获取时区。 |
15 | int getMinimum(int field) 返回给定字段的最小值。 |
16 | int hashCode() 覆盖 hashCode。 |
17 | boolean isLeapYear(int year) 确定给定年份是否为闰年。 |
18 | void roll(int field, boolean up) 在给定的时间字段上添加或减去(上/下)一个时间单位,而不会更改较大的字段。 |
19 | void set(int field, int value) 使用给定值设置时间字段。 |
20 | void set(int year, int month, int date) 设置年份、月份和日期字段的值。 |
21 | void set(int year, int month, int date, int hour, int minute) 设置年份、月份、日期、小时和分钟字段的值。 |
22 | void set(int year, int month, int date, int hour, int minute, int second) 设置年份、月份、日期、小时、分钟和秒字段的值。 |
23 | void setGregorianChange(Date date) 设置格里高利历更改日期。 |
24 | void setTime(Date date) 使用给定的日期设置此日历的当前时间。 |
25 | void setTimeInMillis(long millis) 使用给定的长整型值设置此日历的当前时间。 |
26 | void setTimeZone(TimeZone value) 使用给定的时区值设置时区。 |
27 | String toString() 返回此日历的字符串表示形式。 |
示例
import java.util.*; public class GregorianCalendarDemo { public static void main(String args[]) { String months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; int year; // Create a Gregorian calendar initialized // with the current date and time in the // default locale and timezone. GregorianCalendar gcalendar = new GregorianCalendar(); // Display current time and date information. System.out.print("Date: "); System.out.print(months[gcalendar.get(Calendar.MONTH)]); System.out.print(" " + gcalendar.get(Calendar.DATE) + " "); System.out.println(year = gcalendar.get(Calendar.YEAR)); System.out.print("Time: "); System.out.print(gcalendar.get(Calendar.HOUR) + ":"); System.out.print(gcalendar.get(Calendar.MINUTE) + ":"); System.out.println(gcalendar.get(Calendar.SECOND)); // Test if the current year is a leap year if(gcalendar.isLeapYear(year)) { System.out.println("The current year is a leap year"); }else { System.out.println("The current year is not a leap year"); } } }
这将产生以下结果:
输出
Date: Apr 22 2009 Time: 11:25:27 The current year is not a leap year
有关 Calendar 类中可用常量的完整列表,请参阅标准 Java 文档。