Java 基础知识04 Date、Calendar、LocalDateTime、SimpleDateFormat详细使用以及String字符串常用方法

1.Date

Date类表示特定的瞬间,精确到毫秒。

对于Date,很多方法已经过时迁移到了Calendar类上,但是这是最初的时间类,有2种方法可以创建Date对象(需要掌握)。

1.1 构造方法

(1) public Date()

创建一个代表系统当前日期的Date对象

分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)。

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

控制台输出:

Wed Feb 23 15:11:07 CST 2022

(2)public Date(long date)

根据给定的毫秒值创建日期对象。

long time = System.currentTimeMillis();
Date date = new Date(time);
System.out.println(date);

控制台输出:

Wed Feb 23 15:14:58 CST 2022

1.2 日期转毫秒值

public long getTime()

通过getTime方法可以将一个日期类型转换为long类型的毫秒值

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

控制台输出:

1645600802325

1.3 毫秒值转日期

public void setTime(long time)

long time = System.currentTimeMillis();
Date date = new Date();
date.setTime(time);
System.out.println(date);

控制台输出:

Wed Feb 23 15:24:14 CST 2022

2.Calendar

在实际项目当中,我们经常会涉及到对时间的处理,例如登陆网站,我们会看到网站首页显示XXX,欢迎您!今天是XXXX年。。。。

对于这些经常需要处理的问题,Java中提供了Calendar这个专门用于对日期进行操作的类,那么这个类有什么特殊的地方呢,首先我们来看Calendar的声明

public abstract class Calendar
extends Object
implements Serializable, Cloneable, Comparable<Calendar>

该类被abstract所修饰,说明不能通过new的方式来获得实例,对此,Calendar提供了一个类方法getInstance,以获得此类型的一个通用的对象,getInstance方法返回一个Calendar对象(该对象为Calendar的子类对象),其日历字段已由当前日期和时间初始化:

2.1 获取年、月、日、时、分、秒

    public static void main(String[] args) {

        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        //Calendar在月份上的常数值从Calendar.JANUARY开始是0,到Calendar.DECEMBER的11,所以如果想要显示传回值的真正意涵,可以如下撰写:
        //String[] months = {"一月", "二月", "三月", "四月","五月", "六月", "七月", "八月","九月", "十月", "十一月", "十二月"};
        int month=calendar.get(Calendar.MONTH)+1;
        int day=calendar.get(Calendar.DAY_OF_MONTH);
        // 获取时
        int hour = calendar.get(Calendar.HOUR);
        // int hour = calendar.get(Calendar.HOUR_OF_DAY); // 24小时表示

        // 获取分
        int minute = calendar.get(Calendar.MINUTE);

        // 获取秒
        int second = calendar.get(Calendar.SECOND);

        // 星期,英语国家星期从星期日开始计算
        int weekday = calendar.get(Calendar.DAY_OF_WEEK)-1;

        System.out.println("现在是" + year + "年" + month + "月" + day + "日" + hour
                + "时" + minute + "分" + second + "秒" + "星期" + weekday);
    }

控制台输出:

现在是2022年2月23日4时34分13秒星期3

3.LocalDateTime

之前在做项目的过程中,对日期时间类没有一个系统的了解,总是在用的时候去搜索一下,解决问题即完事,久而久之,导致对这个概念特别模糊。直到近期,做项目的过程中使用了mybatis-plus框架,这个框架自动生成映射文件的工具会将MySQL中的datetime类型转化成Java中的LocalDateTime类型,由于几次都出现了转化错误、转化繁琐的问题,因此,就打算详细的了解一下Java中的时间类的相关知识

Java的Date,Calendar类型使用起来并不是很方便,而且Date类有着线程不安全等诸多弊端。同时若不进行封装,会在每次使用时特别麻烦。于是Java8推出了线程安全、简易、高可靠的时间包。并且数据库中也支持LocalDateTime类型,在数据存储时候使时间变得简单。Java8这次新推出的包括三个相关的时间类型:LocalDateTime年月日时分秒;LocalDate日期;LocalTime时间;三个包的方法都差不多。

public final class LocalDateTime
extends Object
implements Temporal, TemporalAdjuster, ChronoLocalDateTime<LocalDate>, Serializable

3.1 获取当前时间

方法说明:从指定时区的系统时钟获取当前的日期时间。

public static LocalDateTime now()

使用案例:

System.out.println(LocalDateTime.now());

控制台输出:

2022-02-23T16:35:41.042

3.2 格式化日期(常用)

案例1:

方法说明:使用指定的格式化程序格式化此日期时间。

public String format(DateTimeFormatter formatter)

使用案例:

    public static void main(String[] args) {
        //java1.7
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        System.out.println(sdf.format(date));
        //java1.8
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss")));
    }

控制台输出:

2022-02-23 04:38:15
2022-02-23 04:38:15

案例2:

    public static void main(String[] args) {
        String stp = DateTimeFormatter.ofPattern("yyyyMMdd HHmmss").format(LocalDateTime.now());
        System.out.println(stp);
    }

3.3 自定义localDateTime日期

方法说明:从年,月,日,小时,分钟和秒获得LocalDateTime的实例

public static LocalDateTime of(int year,
                               int month,
                               int dayOfMonth,
                               int hour,
                               int minute,
                               int second)

使用案例:

System.out.println(LocalDateTime.of(2017, 7, 13, 16, 22, 50));

控制台输出:

2017-07-13T16:22:50

3.4 获取年月日时分秒

使用案例:

    public static void main(String[] args) {
        //java 1.8
        LocalDateTime ldt = LocalDateTime.now();
        System.out.println(LocalDateTime.now());
        //
        System.out.println(ldt.getYear());
        //月(英文)1-12
        //System.out.println(ldt.getMonth());
        //月(中文)1-12
        System.out.println(ldt.getMonthValue());
        //日(以年计算)1-365
        //System.out.println(ldt.getDayOfYear());
        //日(以月计算)1-30
        System.out.println(ldt.getDayOfMonth());
        //
        System.out.println(ldt.getHour());
        //
        System.out.println(ldt.getMinute());
        //
        System.out.println(ldt.getSecond());
    }

控制台输出:

2022-02-23T17:08:29.493
2022
2
23
17
8
29

3.5 给当前日期添加2小时

方法说明:

public LocalDateTime plusHours(long hours)

使用案例:

System.out.println(LocalDateTime.now().plusHours(2));

效果图:

3.6 给当前日期减少2小时

方法说明:

public LocalDateTime minusHours(long hours)

使用案例:

System.out.println(LocalDateTime.now().minusHours(2));

控制台输出:

2022-02-23T15:41:33.320

3.7 比较两个日期大小

方法说明:

public boolean isAfter(ChronoLocalDateTime<?> other)
public boolean isBefore(ChronoLocalDateTime<?> other)

使用案例:

    public static void main(String[] args) {
        LocalDateTime time = LocalDateTime.of(2017, 7, 12, 15, 12, 12);
        //判断是否在time时间之前
        System.out.println(LocalDateTime.now().isBefore(time));
        //判断是否在time时间之后
        System.out.println(LocalDateTime.now().isAfter(time));
    }

控制台输出:

false
true

3.8 工具类DateUtil

public class DateUtil {
    /**
     * 获取前days天的日期
     * @param days
     * @return
     */
    public static LocalDateTime getMinusDays(int days){
        LocalDateTime now =LocalDateTime.now();
        LocalDateTime minusDays = now.minusDays(days);
        return minusDays;
    }

    /**
     * 获取指定日期的最小时间
     * @param localDateTime
     * @return
     */
    public static String getStartTimeOfDay(LocalDateTime localDateTime){
        LocalDateTime minusTimeEnd = LocalDateTime.of(localDateTime.toLocalDate(), LocalTime.MIN);
        return minusTimeEnd.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

    /**
     * 获取指定日期的最大时间
     * @param localDateTime
     * @return
     */
    public static String getEndTimeOfDay(LocalDateTime localDateTime){
        LocalDateTime minusTimeEnd = LocalDateTime.of(localDateTime.toLocalDate(), LocalTime.MAX);
        return minusTimeEnd.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

    /**
     * 获取日期
     * @param localDateTime
     * @return
     */
    public static String getDate(LocalDateTime localDateTime){
        return localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    }


    public static String getDateByFormatter(LocalDateTime localDateTime,String formatter){
        return localDateTime.format(DateTimeFormatter.ofPattern(formatter));
    }
}

3.9 SimpleDateFormat

3.9.1 将String类型的日期格式转为标准的Date类型的格式

接口说明:

public Date parse(String var1) throws ParseException

具体案例:

    public static void main(String[] args) {
        try {
            String createDate="20210918";
            SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyyMMdd");
            Date date = simpleDateFormat.parse(createDate);
            System.out.println(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

执行结果:

3.9.2 将标准的Date类型数据转换为String类型的日期格式

接口说明:

public final String format(Date var1)

具体案例:

   public static void main(String[] args) {
        try {

            Date date1 = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            String datetime = sdf.format(date1);
            System.out.println(datetime);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

执行结果:

 

4.String类常用方法汇总

(1)删除字符串的头尾空白符

public String trim()

(2)从指定位置截取字符串

public String substring(int beginIndex, int endIndex)

注意:

beginIndex -- 起始索引(包括), 索引从 0 开始。

endIndex -- 结束索引(不包括)。

(3)根据匹配给定的正则表达式来拆分字符串

public String[] split(String regex, int limit)

参数:<1>regex -- 正则表达式分隔符。  <2>limit -- 分割的份数(参数2往往可以省略)

注意: . 、 | 和 * 等转义字符,必须得加 \\。

2.字符串转为Arraylist集合的自定义方法

private static ArrayList<String> stringToArrayList(String str) {
        //1.String.substring() 从指定位置开始到指定位置结束截取字符串
        String strTemp=str.substring(1,str.length()-1);
        //2.String.split() 字符串拆分
        String[] strResult=strTemp.split(", ");
        ArrayList<String> resultList=new ArrayList<>();
        for (int i = 0; i <strResult.length ; i++) {
            resultList.add(strResult[i]);
        }
        return resultList;
    }

注意:该方法输入为以下格式(ArrayList.toString后就会得到以下形式的字符串):

[可燃爆粉尘作业场所, 喷涂作业场所, 涉氨制冷企业, 有限空间作业场所]

输出为ArrayList集合的形式。

 5.StringUtils工具类

maven依赖:

    <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.1</version>
     </dependency>

(1)isNotBlank方法

public static boolean isNotBlank(String str)

判断某字符串是否不为空且长度不为0且不由空白符(whitespace)构成,等于!isBlank(String str)

System.out.println(StringUtils.isNotBlank(null));
System.out.println(StringUtils.isNotBlank(""));
System.out.println(StringUtils.isNotBlank(" "));
System.out.println(StringUtils.isNotBlank("/b"));
System.out.println(StringUtils.isNotBlank("bob"));
System.out.println(StringUtils.isNotBlank(" bob "));

控制台输出:

 参考文献:https://www.cnblogs.com/huangminwen/p/6041168.html

https://blog.csdn.net/liboyang71/article/details/75085326----推荐

https://blog.csdn.net/kingboyworld/article/details/75808108

posted @ 2019-04-15 21:41  雨后观山色  阅读(483)  评论(0编辑  收藏  举报