java 时间日期常用API(1.7)



时间日期类依赖关系

java util text sql Date private transient Date() Date(long date) Calendar TimeZone Locale Date2 Time TimStamp DateFormat SimpleDateFormat

主要的类有:

Date类负责时间的表示,在计算机中,时间的表示是一个较大的概念,现有的系统基本都是利用从1970.1.1 00:00:00 到当前时间的毫秒数进行计时,这个时间称为epoch。在后文中如果没有明确说明,毫秒数就是指从1970年到对应时间的毫秒数。在Java 的Date类内部其实也是一个毫秒数,对外表现为一个Date对象。

Calendar是一个工具类,负责对Date类进行修改等操作,以及从Date类中提取年月日等时间的特定信息。

DateFormat 则负责日期的转换,比如读取特定格式的字符串,转换成date对象,或者将date对象按照指定的格式转成字符串。

util

Date

使用 java.util.Date 表示日期与时间,其承载了毫秒级精度的 Unix 时间。内部主要是一个long值存储距离纪元时的毫秒数。绝大多数方法都是过时的。

构造方法

public class Date{
        private transient long fastTime;
        Date(){
            this(System.currentTimeMillis());
        }
        Date(long date){
            fastTime = date;
        }
        //……
    }

常用方法

方法描述
boolean after(Date date)如果调用Date对象包含的日期晚于date指定的日期,则返回true,否则返回false。
boolean before(Date date)如果调用Date对象包含的日期早于date指定的日期,则返回true,否则返回false。
int compareTo(Date date)将调用对象的值与date的值进行比较。 如果值相等则返回0。 如果调用对象早于date,则返回负值。 如果调用对象晚于date,则返回正值。
int compareTo(Object obj)如果obj对象是Date类对象,则与compareTo(Date)操作相同。 否则,它会抛出ClassCastException。
boolean equals(Object date)如果调用Date对象包含与date指定的时间和日期相同的时间和日期,则返回true,否则返回false。
long getTime()返回自1970年1月1日以来经过的毫秒数。
void setTime(long time)设置时间指定的时间和日期,表示从1970年1月1日午夜开始的经过时间(以毫秒为单位)。
static Date from(Instant instant)从Instant对象获取一个Date的实例。jdk1.8新增
Instant toInstant()将此Date对象转换为Instant 。jdk1.8新增

日期比较

Java使用以下三种方法来比较两个日期:

  • 使用 getTime() 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值。
  • 使用方法before(),after() 和 equals()。例如,一个月的12号比18号早,则 new Date(99, 2,
    12).before(new Date (99, 2, 18)) 返回true。
  • 使用 compareTo() 方法,它是由Comparable 接口定义的,Date 类实现了这个接口。

TimeZone

时区(24个,如Asia/shanghai)

//获取默认时区
TimeZone.getDefault();

Locale

国家(或地区)和语言(如zh_CN)

// 获取默认国家和语言
Locale.getDefault();

Calendar

Calendar 日期和时间操作的主要类,是抽象类,提供了多个静态方法,可以获取Calendar实例。
与Date类似,Calendar内部也有一个表示时刻的毫秒数,还定义了一个数组(长度17),表示日历中各个字段的值。

相比较于 java.util.Date,java.util.Calendar 除了承载毫秒级的 Unix 时间,还承载了时区信息(默认使用系统的时区),并且,提供了诸多接口:“年、月、日、时、分、秒” 字段的获取与设置,时区设置,日期与时间的偏移调整。

从JDK1.1版本开始,在处理日期和时间时,系统推荐使用Calendar类进行实现。在设计上,Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些

Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。

proteted long time;
proteted int fields[];
// fields中存放的是下面这些字段的值,给Calendar
	Calendar.YEAR,
    Calendar.MONTH,
    Calendar.DAY_OF_MONTH,
    Calendar.DAY_OF_WEEK,
    Calendar.HOUR_OF_DAY,
    Calendar.MINUTE,
    Calendar.SECOND,
    Calendar.MILLISECOND
    
    Calendar还支持根据字段增加减少时间(负数表示减少)。
    Calendar.getInstance().add(Calendar.MONTH,-2); //
Calendar做了一项非常繁琐的工作,根据TimeZone 和 Locale 再绝对时间毫秒数和日历字段之间自动进行转换。

使用方式

可以通过Calendar实例获取这些值(Calendar会根据时区,地区语言进行转换)。


@Test
public void testCalendar() {
	//空构造函数,会获取当前的。 Calendar.getInstance("Asia/shanghai","zh_CN")
    Calendar c1 = Calendar.getInstance();
    // 获得年份
    int year = c1.get(Calendar.YEAR);
    // 获得月份
    int month = c1.get(Calendar.MONTH) + 1;
    // 获得日期
    int date = c1.get(Calendar.DATE);
    // 获得小时
    int hour = c1.get(Calendar.HOUR_OF_DAY);
    // 获得分钟
    int minute = c1.get(Calendar.MINUTE);
    // 获得秒
    int second = c1.get(Calendar.SECOND);
    // 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推)
    int day = c1.get(Calendar.DAY_OF_WEEK);
    System.out.println("星期" + day + " " + year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second);

    // 创建一个指定日期的Calendar对象
    Calendar c2 = Calendar.getInstance();
    c2.set(2020, (12 - 1), 5);
    System.out.println(c2.get(Calendar.YEAR) + "年" + (c2.get(Calendar.MONTH) + 1) + "月" + c2.get(Calendar.DATE) + "日");
}

sql

TimeStamp(时间戳)

java.sql.Timestamp继承java.util.Date,表示1970年1月1日午夜以来经过的毫秒数时间戳。可以精度达到纳秒级,保留SQL TIMESTAMP小数秒值的功能,时间戳还提供格式化和解析操作,以支持时间戳值的JDBC转义语法。
在 Java 8 之前,我们使用 java.sql.Timestamp 来表示时间戳对象,可以通过以下方式创建与获取对象:

@Test
public void testTimestamp() {
    // 利用系统标准时间创建
    Timestamp timestamp = new Timestamp(System.currentTimeMillis());
    // 获取自 1970-01-01 00:00:00 GMT 以来的毫秒数
    System.out.println(timestamp.getTime());

    // 从 Date 对象中创建
    Timestamp timestamp1 = new Timestamp((new Date()).getTime());
    System.out.println(timestamp1.toString());
}
//输出结果
1607750356429
2020-12-12 13:19:16.429

text(格式转换)

DateFormat

DateFormat(线程不安全) 提供Date和字符串表示之间的转换,主要的两个方法 format(Date d),parse(String s)
Date的字符串表示与TimeZone、Locale都是相关的。
同时与两个格式化风格相关,一个是日期格式化风格,一个是时间格式化风格。
DataFormat是抽象方法,也用工厂方法创建对象。

    DateFormat.getTimeInstance();
    DateFormat.getDateInstance();
    DateFormat.getDateTimeInstance();

其中getTimeInstance只处理时间,getDateInstance只处理日期,getDateTimeInstance处理日期和时间,三种对象的处理结果如下

Calendar calendar = Calendar.getInstance();
    
    //结果是21:34:20
    DateFormat.getTimeInstance().format(calendar.getTime());
    //结果是2019-02-20
    DateFormat.getDateInstance().format(calendar.getTime());
    //结果是2019-02-20 21:34:20
    DateFormat.getDateTimeInstance().format(calendar.getTime());

SimpleDateFormat

DateFormat是抽象类,能够快速地进行日期与时间的格式化输出和字符串解析,它与以语言无关的方式格式化并解析日期或时间,所以使用其子类SimpleDateFormat实现日期和字符串的相互转换。

/**
 * 使用SimpleDateFormat测试日期和字符串的相互转换
 *
 * @throws ParseException
 */
@Test
public void testSimpleDateFormat() throws ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    // 将字符串转化为日期
    Date date = sdf.parse("2020-12-05 16:31:39");
    System.out.println(date);

    // 将日期转化为字符串
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    String str = dateFormat.format(date);
    System.out.println(str);
}
//输出结果
Sat Dec 05 16:31:39 CST 2020
2020/12/05 16:31:39

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好奇新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值