Java Date DateFormat的一些方法介绍

简介

本文简单介绍Date DateFormat的常用方法

Date

Date的构造方法
Date的构造方法
Date的部分方法
Date已过时的方法

通过上图我们其实可以发现Date中的方法大多都已经过时了,我们只需要了解一些现在还在使用的方法,其他过时的方法我们大多需要通过Calendar类或者DateFormat中的方法去实现了。

Date的构造方法

现在我们使用的Date的构造方法只有两个,我通过代码测试了一下这两个代码

        Date date = new Date();
        System.out.println("date = " + date);
        Date date2 = new Date(50000L);
        System.out.println("date2 = " + date2);

运行图示:
Date构造方法测试

可以发现,如果没有参数的构造方法构造Date类型的数据,他会获取本地时间。
如果有一个long类型的参数x,他会在1970年1月1日00:00:00 GMT的基础上加上x毫秒,即为构造出的date类型的值。

after 测试此日期是否在指定日期之后

为了方便在目录中观看并且迅速找到方法,我把方法的名称和大致功能都写在了标题上。
参数:

public boolean after​(Date when)

测试代码:

        Date date1 = new Date(48L);
        Date date2 = new Date(49L);
        Date date3 = new Date(50L);

        System.out.println(date2.after(date1));
        System.out.println(date2.after(date2));
        System.out.println(date2.after(date3));

运行图示:
Date after方法

可以发现等于的情况它返回的也是false

before 测试此日期是否在指定日期之前

参数:

public boolean before​(Date when)

测试代码:

        Date date1 = new Date(48L);
        Date date2 = new Date(49L);
        Date date3 = new Date(50L);

        System.out.println(date2.before(date1));
        System.out.println(date2.before(date2));
        System.out.println(date2.before(date3));

运行图示:
Date before方法测试

clone 返回此对象的副本

参数及返回类型:

public Object clone()

测试代码:

        Date date1 = new Date(900000000000L);
        Date date2 = (Date) date1.clone();

        System.out.println("date1 = " + date1);
        System.out.println("date2 = " + date2);

运行图示:
Date clone方法测试

compareTo 比较两个日期

参数及返回类型:

public int compareTo​(Date anotherDate)

返回int类型数据,1为调用者更大,0为两者相同,-1为调用者更小
测试代码:

        Date date1 = new Date(900000000000L);
        Date date2 = new Date(900000000001L);
        Date date3 = new Date(900000000002L);

        System.out.println(date2.compareTo(date1));
        System.out.println(date2.compareTo(date2));
        System.out.println(date2.compareTo(date3));

运行图示:
 Date compareTo

equals 比较两个date类型数据是否相等

参数及返回类型:

public boolean equals​(Object obj)

相同为true 不同为false

测试代码:

        Date date1 = new Date(900000000000L);
        Date date2 = new Date(900000000001L);
        Date date3 = new Date(900000000001L);

        System.out.println(date2.equals(date1));
        System.out.println(date2.equals(date2));
        System.out.println(date2.equals(date3));
        System.out.println(date2.equals(null));

运行图示:
Date equals方法

from 从Instant对象获得Date的实例

这个方法涉及到了一个Instant对象,那么这个Instant类又是什么呢?
from  Instant

Instant类

通过api文档我们发现,api文档中没有记录这个类的构造方法,我们只能通过源码来研究这个类了。
Instant类

首先我们通过源码看一下这个类的构造方法:

    /**
     * Constructs an instance of {@code Instant} using seconds from the epoch of
     * 1970-01-01T00:00:00Z and nanosecond fraction of second.
     *
     * @param epochSecond  the number of seconds from 1970-01-01T00:00:00Z
     * @param nanos  the nanoseconds within the second, must be positive
     */
    private Instant(long epochSecond, int nanos) {
        super();
        this.seconds = epochSecond;
        this.nanos = nanos;
    }

构造一个实例需要秒和纳秒,构造出的实例时间是1970-01-01 00:00:00加上秒数的时间,而且最关键的一点是,这个构造方法是用private修饰的。就是说我们是无法构造这个对象的,那么这个对象一般怎么得到呢?

之后我在api中发现了一些静态的方法,通过其中静态的方法我们可以获取Instant对象,比如:

        Instant i = Instant.now();
        System.out.println(i);
        Date date = new Date();
        System.out.println(date);

结果图示:
Instant
可以发现 Instant的时间是与date得到的时间不一样的,而且正好差了8个小时
其实now()方法是有重载方法的:
now方法
简单的研究一下之后我们就可以得到自己时区的时间了:

        Instant i = Instant.now(Clock.systemDefaultZone());
        Instant i2 = Instant.now();
        System.out.println(Clock.systemDefaultZone());
        System.out.println("i = " + i);
        System.out.println("i2 = " + i2);
        Date date = new Date();
        System.out.println("date = " + date);
        Date date2 = Date.from(i);
        System.out.println("date2 = " + date2);
        Date date3 = Date.from(i2);
        System.out.println("date3 = " + date3);

图示:
在这里插入图片描述
但是还是有一些疑问没有解决…为啥它时区与时间显示的不匹配呀…

getTmie 自1970年1月1日00:00:00 GMT以来的毫秒数

参数及返回类型:

public long getTime()

返回的是一个long类型的值
测试代码:

        Date date = new Date();
        System.out.println(date);
        System.out.println(date.getTime());

运行图示:
getTime

setTime 将date对象根据long类型值设置时间

参数及返回类型:

public void setTime​(long time)

将此 Date对象设置为表示格林威治标准时间1970年1月1日00:00:00之后的 time毫秒的时间点。

测试代码:

        Date date = new Date();
        System.out.println(date);
        date.setTime(1515151515112L);
        System.out.println(date);

运行图示:
setTime

hashCode与toString

参数及返回类型:

public int hashCode()
public String toString()

测试代码:

        Date date = new Date();
        System.out.println(date);
        System.out.println(date.hashCode());
        System.out.println(date.toString());

运行图示:
在这里插入图片描述

DateFormat

在这里插入图片描述
根据上图我们可以发现DateFormat是一个抽象类,通常我们使用的应该是它的子类SimpleDateFormat

SimpleDateFormat

构造方法

SimpleDateFormat的构造方法
在构造方法中我们发现了一个String类型的pattern,他要求我们使用它给出的格式设置String类型变量
pattern
而对于其中的参数api也给出了示例:
pattern
尝试的代码:

        SimpleDateFormat sdf1 = new SimpleDateFormat();
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd EEE");
        SimpleDateFormat sdf4 = new SimpleDateFormat("yyyy-MM-dd '第' F '个'" + "星期");
        SimpleDateFormat sdf5 = new SimpleDateFormat("yyyy-MM-dd '第' DDD '天'" );
        SimpleDateFormat sdf6 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");


        Date date = new Date();
        String text = sdf1.format(date);
        System.out.println(text);
        text = sdf2.format(date);
        System.out.println(text);
        text = sdf3.format(date);
        System.out.println(text);
        text = sdf4.format(date);
        System.out.println(text);
        text = sdf5.format(date);
        System.out.println(text);
        text = sdf6.format(date);
        System.out.println(text);

结果图示:
SimpleDateFormat

set2DigitYearStart get2DigitYearStart 设置与获取

参数:

public Date get2DigitYearStart()
public void set2DigitYearStart​(Date startDate)

代码:

        SimpleDateFormat sdf1 = new SimpleDateFormat();
        System.out.println(sdf1.get2DigitYearStart());

        sdf1.set2DigitYearStart(new Date(6565650656L));
        System.out.println(sdf1.get2DigitYearStart());

        Date date = new Date(6565650656L);
        System.out.println(date);

        sdf1.set2DigitYearStart(new Date());
        System.out.println(sdf1.get2DigitYearStart());

结果图示:
在这里插入图片描述
应该是某种要求的时间,没有太理解其中的意义

format 为Date对象设置格式并返回String类型值

这个方法是DateFormat中的方法,SimpleDateFormat中重载了这个方法,可以看看前面构造方法中对于这个format的使用。
参数:

public final String format​(Date date)
toPattern 返回描述日期格式的模式字符串

参数:

public String toPattern()

代码:

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        System.out.println(sdf.toPattern());
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd '第' DDD '天'" );
        System.out.println(sdf2.toPattern());
        SimpleDateFormat sdf3 = new SimpleDateFormat();
        System.out.println(sdf3.toPattern());

结果图示:
toPattern()

toLocalizedPattern 用字符串返回本地日期格式

参数:

public String toLocalizedPattern()

代码:

        SimpleDateFormat sdf3 = new SimpleDateFormat();
        System.out.println(sdf3.toPattern());
        System.out.println(sdf3.toLocalizedPattern());
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        System.out.println(sdf2.toLocalizedPattern());

结果图示:
在这里插入图片描述
从返回值得角度看不出与toPattern有什么区别,需要从源码来看看:
toPattern源码:

    /**
     * Returns a pattern string describing this date format.
     *
     * @return a pattern string describing this date format.
     */
    public String toPattern() {
        return pattern;
    }

toLocalizedPattern源码:

    /**
     * Returns a localized pattern string describing this date format.
     *
     * @return a localized pattern string describing this date format.
     */
    public String toLocalizedPattern() {
        return translatePattern(pattern,
                                DateFormatSymbols.patternChars,
                                formatData.getLocalPatternChars());
    }

其中的translatePattern方法源码:

    /**
     * Translates a pattern, mapping each character in the from string to the
     * corresponding character in the to string.
     *
     * @exception IllegalArgumentException if the given pattern is invalid
     */
    private String translatePattern(String pattern, String from, String to) {
        StringBuilder result = new StringBuilder();
        boolean inQuote = false;
        for (int i = 0; i < pattern.length(); ++i) {
            char c = pattern.charAt(i);
            if (inQuote) {
                if (c == '\'') {
                    inQuote = false;
                }
            }
            else {
                if (c == '\'') {
                    inQuote = true;
                } else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                    int ci = from.indexOf(c);
                    if (ci >= 0) {
                        // patternChars is longer than localPatternChars due
                        // to serialization compatibility. The pattern letters
                        // unsupported by localPatternChars pass through.
                        if (ci < to.length()) {
                            c = to.charAt(ci);
                        }
                    } else {
                        throw new IllegalArgumentException("Illegal pattern " +
                                                           " character '" +
                                                           c + "'");
                    }
                }
            }
            result.append(c);
        }
        if (inQuote) {
            throw new IllegalArgumentException("Unfinished quote in pattern");
        }
        return result.toString();
    }

emmmmm,因为有些类和属性不知道是怎么赋值的所以还是看不明白,但是如果我们要调用pattern的话toPattern应该是ok的。

applyPattern 将给定的模式字符串应用于此日期格式

参数:

public void applyPattern​(String pattern)

代码:

        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd  hh:mm:ss ");
        System.out.println(sdf2.toPattern());
        sdf2.applyPattern("yyyy-MM-dd EEE");
        System.out.println(sdf2.toPattern());

结果图示:
applyPattern

parse 将String类型的时间转换为Date对象存储

参数:

public Date parse​(String source) throws ParseException

代码:

        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd  hh:mm:ss ");
        System.out.println(sdf2.toPattern());
        Date date = sdf2.parse("2020-12-12  16:10:24 ");
        System.out.println(sdf2.toPattern());
        System.out.println(date);

结果图示:
parse
在试验的时候发现,他有一点点格式不同,甚至少一个空格都会报错。这一点需要注意一下。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值