高效开发:三种时间类型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的主要内容,如果未能解决你的问题,请参考以下文章