JAVA中涉及的时间日期转换问题全解

本文主要包含的有:

Date 转为String
String 转为Date
时间戳与Date类型的相互转换
java时间戳与unix时间戳的关系
计算两个时间的差值
DateTimeFormatter
SimpleDateFormat简介

Date 的常用方法
Calendar的方法及使用
注:以下的方法中很多常量和方法我都没有提取出来,正式项目中还是建议大家封装在时间处理类中,规范化操作

1.Date 转为String

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date();
        //SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        String timeval = sdf.format(date);
        System.out.println("===> 格式化后的日期为: " + timeval);
        //===> 格式化后的日期为: 2020-10-28 22:34:35

2.String转Date

           String day="2020-20-09 20:09:08";
            //String day = "2008年08月18日 20:07:33";
           // SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss", Locale.getDefault());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = sdf.parse(day);
            System.out.println("----> 格式化后的日期为: "+date);

3、时间戳转Date转 String

public static void main(String[] args) {
// 10位的秒级别的时间戳
long time1 = 1527767665;
String result1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time1 * 1000));
System.out.println("10位数的时间戳(秒)--->Date:" + result1);
Date date1 = new Date(time1*1000); //对应的就是时间戳对应的Date
// 13位的秒级别的时间戳
double time2 = 1515730332000d;
String result2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time2);
System.out.println("13位数的时间戳(毫秒)--->Date:" + result2);
10位数的时间戳(秒)--->Date:2018-05-31 19:54:25
13位数的时间戳(毫秒)--->Date:2018-01-12 12:12:12

5.Date转时间戳

long timeStamp = System.currentTimeMillis();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
Date date = new Date(timeStamp);
String time = simpleDateFormat.format(date);

System.out.println("----> 当前时间戳为: "+timeStamp+" ,其字符串为:"+time);

Date parsedDate = simpleDateFormat.parse(time);
long ts = parsedDate.getTime();

System.out.println("----> 将字符串转换为时间戳: "+ts);
System.out.println("----------------------------------");
}

6. java时间戳与unix时间戳的关系

java中生成的时间戳精确到毫秒,但unix中精确到秒* 所以两者相差1000*/
long javaTimeStamp = System.currentTimeMillis();
long unixTimeStamp = javaTimeStamp/1000;
System.out.println("----> java时间戳: " + javaTimeStamp+", unix时间戳:" + unixTimeStamp);
System.out.println("----------------------------------");`
System.out: ----> java时间戳: 1558622474893 ,unix时间戳:1558622474

7. 计算两个时间的差值

private String time1="2016-01-02 00:00:00";
private String time2="2013-09-21 00:00:00";


private void getTimeDifference(String time1,String time2) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
try {

Date date1 = simpleDateFormat.parse(time1);
Date date2 = simpleDateFormat.parse(time2);
long difference = date1.getTime() - date2.getTime();
long days = difference / (1000 * 60 * 60 * 24);
System.out.println("----> 两个时间相距:"+days+"天");
} catch (Exception e) {
System.out.println("----> Exception="+e.toString());
}
System.out.println("----------------------------------");
}

8.DateTimeFormatter
Java 8 中的解决办法Java 8 提供了新的日期时间 API,其中包括用于日期时间格式化的 DateTimeFormatter,它与 SimpleDateFormat 最大的区别在于:DateTimeFormatter 是线程安全的,而 SimpleDateFormat 并不是线程安全。

解析日期
String dateStr= "2018年06月20日";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
LocalDate date= LocalDate.parse(dateStr, formatter);
日期转换为字符串
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy年MM月dd日 hh:mm a");
String nowStr = now.format(format);

方法:getTime();得到一个long型的整数
System.currentTimeMillis();//当前日期的毫秒数
new Date().getTime() 和 System.currentTimeMillis() 是一样的

那么最特殊的一个数字,就是零. 零这个数字,就代表Java中的时间原点,其对应的日期是1970年1月1日 8点0分0秒 。 (为什么是8点,因为中国的太平洋时区是UTC-8,刚好和格林威治时间差8个小时)

        //注意:是java.util.Date;
        //而非 java.sql.Date,此类是给数据库访问的时候使用的
       Date now = new Date();//创建日期对象
        //打印当前时间
        System.out.println("当前时间:" + now.toString());
        //getTime() 得到一个long型的整数
        //这个整数代表 1970.1.1 08:00:00:000,每经历一毫秒,增加1
        System.out.println("当前时间getTime()返回的值是:" + now.getTime());
        Date zero = new Date(0);
        System.out.println("用0作为构造方法,得到的日期是:" + zero);
        // 从1970年1月1日 早上8点0分0秒 开始经历的毫秒数
        Date d2 = new Date(5000);
        System.out.println("从1970年1月1日 早上8点0分0秒 开始经历了5秒的时间");

当前时间:Wed Oct 28 23:05:20 CST 2020
当前时间getTime()返回的值是:16038975206600作为构造方法,得到的日期是:Thu Jan 01 08:00:00 CST 1970197011日 早上800秒 开始经历了5秒的时间
 Calendar类即日历类,常用于进行“翻日历”,比如下个月的今天是多久
//采用单例模式获取日历对象Calendar.getInstance();
        Calendar c = Calendar.getInstance();
        //通过日历对象得到日期对象
        Date d = c.getTime();
        Date d2 = new Date(0);
        c.setTime(d2); //把这个日历,调成日期 : 1970.1.1 08:00:00
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar c = Calendar.getInstance();
        Date now = c.getTime();
        // 当前日期
        System.out.println("当前日期:\t" + sdf.format(c.getTime()));
        // 下个月的今天
        c.setTime(now);
        c.add(Calendar.MONTH, 1);
        System.out.println("下个月的今天:\t" +sdf.format(c.getTime()));
        // 去年的今天
        c.setTime(now);
        c.add(Calendar.YEAR, -1);
        System.out.println("去年的今天:\t" +sdf.format(c.getTime()));
        // 上个月的第三天
        c.setTime(now);
        c.add(Calendar.MONTH, -1);
        c.set(Calendar.DATE, 3);
        System.out.println("上个月的第三天:\t" +sdf.format(c.getTime()));
当前日期:	2020-10-28 23:12:27
下个月的今天:	2020-11-28 23:12:27
去年的今天:	2019-10-28 23:12:27
上个月的第三天:	2020-09-03 23:12:27

1.SimpleDateFormat的简介及使用

/**
* SimpleDateFormat
* 一个与语言环境相关的格式化日期和分析日期的工具类。
* 利用该类可以将日期转换成文本,或者将文本转换成日期。
*
* 在使用SimpleDateFormat时需要指定一个需要的格式(pattern)来格式日期(Date).
* 在此请注意几个字母大小写的差异:
*
* 大写的H为24小时制表示一天中的小时数(0-23)
* 小写的h为12小时制表示一天中的小时数(1-12)
*
* 大写的M表示年中的月份
* 小写的m表示小时中的分钟数
*
* 大写的S表示毫秒数
* 小写的s表示秒数
*
* 所以最常用的24小时制的具体日期的pattern为:
* yyyy-MM-dd HH:mm:ss
*
*
* **SimpleDateFormat中format()方法小结:
* 1 format()方法的作用是将日期(Date)转换为文本
* 2 format()方法的输入参数是一个Date**
*
*
* SimpleDateFormat中parse()方法小结:
* 1 parse()方法的作用是将文本转换为日期(Date)
* 2 parse()方法的输入参数是一个文本,比如String

你可能感兴趣的:(Java)