高效开发:三种时间类型TimestampDateString

Posted Java架构师(公众号:毛奇志)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高效开发:三种时间类型TimestampDateString相关的知识,希望对你有一定的参考价值。

第一,新建

时间戳两种新建方法,调用构造函数,用long新建,调用valueOf静态函数,用字符串新建。

Date一种新建方式 new Date() 得到当前时间,要得到指定时间,可以用String或者Timestamp转换过来。

String就是直接新建字符串,new String() 或 直接赋值。

class Solution {
    public static void main(String[] args) throws Exception {
        //  Timestamp新建对象的两种方式:构造函数和静态方法valueOf
        Timestamp timestampNow = new Timestamp(System.currentTimeMillis());  // Timestamp构造函数两个作用:获取当前时间(System.currentTimeMillis())和 类型转换,将date转换为Timestamp
        Timestamp timestamp1 = Timestamp.valueOf("1970-01-02 18:17:02.255");  // Timestamp静态方法valueOf的两个作用:将指定时间转为时间戳 和 类型转换,将String转换为Timestamp

        // Date新建对象的两种方式:无参构造函数,获得当前时间;带参构造函数,timestamp转换为Date
        Date dateNow = new Date();  // 无参构造函数唯一作用:获取当前时间
        Date date = new Date(timestamp1.getTime());  // 唯一带参构造函数,参数为long类型,作用:类型转换,将Timestamp转换为
        // date和String之间的相互转换,必须借助 SimpleDateFormat
    }
}

第二,比较

Timestamp比较时间三个方法 compareTo before after,后面两个其实底层也是调用compareTo。

Date比较时间三个方法 compareTo before after,其实三个一样,都是调用getMillisOf方法。

String比较时间一个方法,直接用compartTo就好。

class Solution {
    public static void main(String[] args) throws Exception {
        // 方式一:根据Long类型来新建时间戳   调用时间戳唯一的构造函数
        Timestamp timestamp = new Timestamp(123422255);
        Timestamp timestamp2 = new Timestamp(934233255);
        System.out.println(timestamp);
        System.out.println(timestamp2);
        System.out.println(timestamp.compareTo(timestamp2));
        System.out.println(timestamp.before(timestamp2));
        System.out.println(timestamp.after(timestamp2));
        // 小结:Timestamp比较三个方法 compareTo before after,后面两个其实底层也是调用compareTo

        System.out.println("====================");

        Date date=new Date(timestamp.getTime());
        Date date1=new Date(timestamp2.getTime());
        System.out.println(date);
        System.out.println(date1);
        System.out.println(date.compareTo(date1));
        System.out.println(date.before(date1));
        System.out.println(date.after(date1));
        // 小结:Date比较三个方法 compareTo before after,其实三个底层都是调用getMillisOf
    }
}

第三,打印输出

第一,直接打印的话:时间戳Timestamp直接打印出标准时间戳,用getTime打印出long。Date直接打印出标准美式时间,用getTime打印出long。String直接打印出字符串。

第二,要想打印出指定格式,用SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(new Date()));   // 当前时间指定格式打印

SimpleDateFormat和Date关系紧密,和Timestamp、String关系疏远:

TimeStamp转换并打印:TimeStamp先转换为Date才可以用SimpleDateFormat格式(调用format方法);
String判断:String通过SimpleDateFormat转换为Date,可以用来判断String字符串是否符合时间标准(调用parse方法);
String转换并打印:String通过SimpleDateFormat转换为Date,就又可以打印标准美式时间格式了(调用parse方法)。

class Solution {
    public static void main(String[] args) throws Exception {
        // TimeStamp转换为Date才可以用SimpleDateFormat格式
        Timestamp timestamp = new Timestamp(123422255);
        Date date=new Date(timestamp.getTime());
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString= sdf.format(date);
        System.out.println(dateString);

        // String通过SimpleDateFormat转换为Date,就又可以打印标准美式时间格式了
        System.out.println(sdf.parse(dateString));
    }
}

第四,获取当前时间

Date新建 new Date得到当前 美式标准时间;
时间戳通过构造函数,long获取当前时间;
String无法获取当前时间。

Date date=new Date();
Timestamp timestampNow = new Timestamp(System.currentTimeMillis());

第五,相互转换 SimpleDateFormat

转换:Date和TimeStamp

通过构造函数和getTime相互转换为对方

Date dateNow = new Date(timestampNow.getTime());
Timestamp timestampNowAgain = new Timestamp(dateNow.getTime());

转换:Date和String

SimpleDateFormat是Date和String之间的桥梁的:Date和String,因为String可以为任意格式,所以这两者之间的转换必须通过SimpleDateFormat 规范化。

sdf的两个方法 通过指定格式,用于完成String和Date两个类型的转换
Date parse(String source) parse,将String解析成时间标准格式,打印出Date
String format(Date date) format,将date格式化打印,打印出String

String 和 Timestamp 之间的转换好似没有。 TimeStamp+"" 就变成了字符串

class Solution {
    public static void main(String[] args) throws Exception {
        Date date=new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString= sdf.format(date);
        System.out.println(dateString);   // date转换为dateString
        System.out.println(sdf.parse(dateString)); // dateString又转换为date
    }
}

parse函数是把字符串转换成日期,format函数是把日期转换成字符串。即parse 解析字符串的文本,生成 Date。format将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBuffer。

注意,关于 yyyy-MM-dd HH:mm:ss,Java中,从年月日时分秒来说,

年:有 yyyy 和 YYYY 两种方式,为什么用 yyyy 这种?唯一影响的是12月最后一周,

yyyy是表示Year,就是当前时间或字符串指定时间。
YYYY是表示Week year:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年。

class Solution {
    public static void main(String[] args) throws Exception {
        System.out.println("==========使用Calendar构建时间===============");
        Calendar calendar = Calendar.getInstance();
        calendar.set(2017, Calendar.DECEMBER, 31); // 2017年最后一天是周日,所以最后一周跨年了
        Date strDate1 = calendar.getTime();
        SimpleDateFormat sf1 = new SimpleDateFormat("YYYY-MM-dd");
        System.out.println("大写 YYYY: " + sf1.format(strDate1));  // 2018-12-31
        SimpleDateFormat sf2 = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println("小写 yyyy: " + sf2.format(strDate1));  // 2017-12-31

        System.out.println("----------------------------------");

        calendar.set(2016, Calendar.DECEMBER, 31);  // 2016年最后一天是周六,所以最后一周没有跨年
        strDate1 = calendar.getTime();
        System.out.println("大写 YYYY: " + sf1.format(strDate1));  // 2016-12-31
        System.out.println("小写 yyyy: " + sf2.format(strDate1));  // 2016-12-31

        System.out.println("==========也可以用String构建时间===============");
        String dateString = "2017-12-31";
        System.out.println("大写 YYYY: " + sf1.parse(dateString));  // 2017-01-01
        System.out.println("小写 yyyy: " + sf2.parse(dateString));  // 2017-12-31
        System.out.println("----------------------------------");
        dateString = "2016-12-31";
        System.out.println("大写 YYYY: " + sf1.parse(dateString));  // 2015-12-27
        System.out.println("小写 yyyy: " + sf2.parse(dateString));  // 2017-12-31
    }
}

月:只有M或者MM这种方式,小写 m mm表示分钟,不表示月份。

日:有 dd 和 DD 两种方式,为什么用 dd 这种?

DD格式是指 day of year,表示当前日期在当年中的天数,如果今天正好是当年的一百天,导致字符串多了一位;
dd格式是指 day of month,表示当前日期在当月中的天数,不会超过两位。

时:有 HH 和 hh 两种方式,为什么用 HH 这种?因为HH表示 24小时制 hh表示12小时制,前者更常用。

分:只有m或者mm这一种方式,MM表示月份,不表示分钟

秒:有ss 和 SSS 两种形式, ss:代表秒,SSS:代表毫秒,连在一起用,HH:mm:ss.SSS。

关于前导零,月份MM和M,小时HH和H,分钟mm和m,秒钟ss和s,它们的区别为是否有前导零,M,H,m,s表示非零开始,MM,HH,mm,ss表示从零开始,比如月份数字,使用M一位数的月份没有前导零,使用MM和M一样,区别就是MM表示从零开始,比如四月份,MM显示04,M显示4。再比如凌晨1点2分,HH:mm显示为01:02,H:m显示为1:2。

从字母大小写来说,
MM表示月 mm表示分钟
HH表示 24小时制 hh表示12小时制

第六,增加一天 Calendar

如果要增加一天或减少一天,必须先获得Date中的当前天,这就要用到Calendar,对Date中的某种字段获取并操作。

class Solution {
    public static void main(String[] args) throws Exception {
        // SimpleDateFormat用于检测字符串的格式,Calendar用来对Date增减  两者不同
        String dateString = "2020-09-18 10:09:08";
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = simpleDateFormat.parse(dateString);
        Calendar calendar = Calendar.getInstance();  // 这样获取的calender是当前时间,下面打印
        System.out.println(calendar.getTime());
        System.out.println(calendar.get(Calendar.YEAR) + "年" + (calendar.get(Calendar.MONTH) + 1) + "月" + calendar.get(Calendar.DATE) + "日" + calendar.get(Calendar.HOUR) + "时" + calendar.get(Calendar.MINUTE) + "分" + calendar.get(Calendar.SECOND) + "秒");
        calendar.setTime(date); // calendar和date关联,增加一天   通过调用setTime,这样获取的calender是就是指定时间了
        System.out.println(calendar.getTime());
        calendar.add(Calendar.YEAR, 1);
        calendar.add(Calendar.MONTH, 1);
        calendar.add(Calendar.DATE, 1);
        calendar.add(Calendar.HOUR, 1);
        calendar.add(Calendar.MINUTE, 1);
        calendar.add(Calendar.SECOND, 1);
        System.out.println(calendar.getTime());
        System.out.println(calendar.get(Calendar.YEAR) + "年" + (calendar.get(Calendar.MONTH) + 1) + "月" + calendar.get(Calendar.DATE) + "日" + calendar.get(Calendar.HOUR) + "时" + calendar.get(Calendar.MINUTE) + "分" + calendar.get(Calendar.SECOND) + "秒");
    }
}

注意,SimpleDateFormat用于检测字符串的格式,Calendar用来对Date增减 两者不同。

注意,Calendar.MONTH ,在Caledar类中,第一个月是 JANUARY,但是它的值是 0,即 public final static int JANUARY = 0; 即 Calendar.MONTH的下标从0开始,所以我们用 Calendar.MONTH 来表示日历月份时需要加1。

注意,对于Calendar类, 使用getInstance()获得一个Calendar类型的通用对象,getInstance()将返回一个Calendar的对象。至于为什么不用 Calendar c=new Calendar();

原因是:Calendar类是一个抽象类,在实际使用时实现特定的子类的对象。由于Calendar类是抽象类,且Calendar类的构造方法是protected的,所以无法使用Calendar类的构造方法来创建对象,API中提供了getInstance方法用来创建对象。

所以定义一个Calendar对象就应该为:

Calendar  cal= Calendar.getInstance();

总体代码

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.*;

class Solution {
    public static void main(String[] args) throws Exception {
        // 方式一:根据Long类型来新建时间戳   调用时间戳唯一的构造函数
        Timestamp timestamp = new Timestamp(123422255);
        Timestamp timestamp2 = new Timestamp(934233255);
        System.out.println(timestamp);
        System.out.println(timestamp2);
        System.out.println(timestamp.compareTo(timestamp2));
        System.out.println(timestamp.before(timestamp2));
        System.out.println(timestamp.after(timestamp2));
        // 小结:Timestamp比较三个方法 compareTo before after,后面两个其实底层也是调用compareTo

        System.out.println("====================");

        // 方式二:根据字符串新建时间戳   Timestamp的静态方法valueOf
        Timestamp timestamp1 = Timestamp.valueOf("1970-01-02 18:17:02.255");
        Timestamp timestamp3 = Timestamp.valueOf("1970-01-12 03:30:33.255");
        System.out.println(timestamp);
        System.out.println(timestamp2);
        System.out.println(timestamp.compareTo(timestamp2));
        System.out.println(timestamp.before(timestamp2));
        System.out.println(timestamp.after(timestamp2));

        System.out.println("====================");

        // 根据字符串新建date SimpleDateFormat类用于打印指定格式的date
        String time = "1970-01-02 18:17:02.255";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d1 = sdf.parse(time);
        System.out.println(d1);  // 标准格式的date
        System.out.println(sdf.format(d1));  // 指定格式的date
        //  sdf的两个方法   通过指定格式,用于完成String和Date两个类型的转换
        // Date parse(String source)   parse,将String解析成时间标准格式,打印出Date
        // String format(Date date)    format,将date格式化打印,打印出String

        System.out.println("====================");

        // date直接比较时间大小
        Date d2 = new Date();  // Date获取当前时间
        System.out.println(d2);
        System.out.println(sdf.format(d2));

        System.out.println("====================");

        Timestamp timestampNow = new Timestamp(System.currentTimeMillis());  // Timestamp获取当前时间
        System.out.println(timestampNow);   // 打印时间戳格式
        System.out.println(timestampNow.getTime());  // 打印时间戳的long格式  long getTime() 将标准时间戳变为long
        Date dateNow = new Date(timestampNow.getTime());
        System.out.println(dateNow);   // 时间戳变为date
        Timestamp timestampNowAgain = new Timestamp(dateNow.getTime());  // Date和Timestamp都有getTime方法,将标准美式时间转为long,将标准时间戳转为long,
        // 将Date转为long可以放到时间戳构造函数中,将时间戳转为long可以换一种方式打印出来,但一般不用来比较大小
        System.out.println(timestampNowAgain);  // date可以转换为时间戳
    }
}

以上是关于高效开发:三种时间类型TimestampDateString的主要内容,如果未能解决你的问题,请参考以下文章

高效性不是大数据处理平台hadoop的特点

高效开发:jdk8新特性,流模式

高效开发:jdk8新特性,流模式

高效开发:常见类型之间的转换

高效开发:常见类型之间的转换

Eclipse高效率开发技巧