<strike id="j6ksu"></strike>
<th id="j6ksu"></th>
  1. <th id="j6ksu"></th>

    Joda-Time处理Java中的日期时间更简便高效

    Java Web 潘老师 3个月前 (08-16) 307 ℃ (1) 扫码查看

    在Java开发过程中,免不了要处理日期和时间,尤其是格式的转换、时间的加减以及时区问题,非常令人头疼!而JDK中我们熟悉的基础的工具类就是DateCalendar,想必用过的同学都知道,这两个类功能并不是特别方便和强大,于是Joda-Time这个专门处理日期时间的库就应运而生了。

    Joda-Time官网

    有兴趣的同学可以直接跳到Joda-Time官网去学习,不过全是英文的哦~
    Joda-Time官网

    Joda-Time的简单介绍

    首先要想使用Joda-Time就必须在项目中导入相关的jar包,maven项目就直接导入如下依赖:

    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.9.9</version>
    </dependency>
    

    1、核心类

    • Instant – 不可变的类,用来表示时间轴上一个瞬时的点
    • DateTime – 不可变的类,用来替换JDK的Calendar类
    • LocalDate – 不可变的类,表示一个本地的日期,而不包含时间部分(没有时区信息)
    • LocalTime – 不可变的类,表示一个本地的时间,而不包含日期部分(没有时区信息)
    • LocalDateTime – 不可变的类,表示一个本地的日期-时间(没有时区信息)

    注意:不可变的类,表明了正如Java的String类型一样,其对象是不可变的。即,不论对它进行怎样的改变操作,返回的对象都是新对象。

    Instant比较适合用来表示一个事件发生的时间戳。不用去关心它使用的日历系统或者是所在的时区。
    DateTime的主要目的是替换JDK中的Calendar类,用来处理那些时区信息比较重要的场景。
    LocalDate比较适合表示出生日期这样的类型,因为不关心这一天中的时间部分。
    LocalTime适合表示类似景点的每天开门/关门时间,因为不用关心日期部分。

    Joda-Time的使用技巧总结

    2、其他类

    Joda-Time为时间段的表示提供了支持。

    • Interval:它保存了一个开始时刻和一个结束时刻,因此能够表示一段时间,并进行这段时间的相应操作
    • Period:它保存了一段时间,比如:6个月,3天,7小时这样的概念。可以直接创建Period,或者从Interval对象构建。
    • Duration:它保存了一个精确的毫秒数。同样地,可以直接创建Duration,也可以从Interval对象构建。

    一、Joda Time基础操作

    1、 构造指定时间

    // 明确给出年月日时分秒,同时还可以指定毫秒
    DateTime dateTime = new DateTime(2021,8,16,12,30,0);  
    
    // 使用时间戳构造
    Datetime dateTime = new DateTime(1605371058358L);
    
    // 使用字符串构造,使用字符串构造需要自己定义pattern
    String date = "2021-08-16 12:30:00";
    DateTimeFormatter dtf= DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
    DateTime dateTime = dtf.parseDateTime(date);
    
    // 指定时区构造时间
    DateTime dateTime = new DateTime(DateTimeZone.forTimeZone(TimeZone.getTimeZone("Asia/Shanghai")));
    

    注意:Asia/Shanghai是国际时区Id,该ID可以通过JDK代码获取,代码如下:

    String[] zones = TimeZone.getAvailableIDs();
    for (String zone : zones) {
        System.out.println(zone);
    }
    

    2、获取当前时间的时间戳

    // JDK
    long now= System.currentTimeMillis();
    // Joda Time
    long now = DateTime.now().getMillis();
    

    3、获得当前时间的时区

    DateTimeZone zone = DateTime.now().getZone();
    

    4、 获取指定时区的当前时间

    DateTimeZone gmt = DateTimeZone.forID("GMT");
    DateTime dateTime = DateTime.now().toDateTime(gmt);
    

    二、Joda Time 对年月日的简单操作

    1、 获取月初第一天和月末最后一天

    DateTime dateTime = new DateTime();
    // 月初第一天
    DateTime theFirstDateOfMonth = dateTime.dayOfMonth().withMinimumValue();
    //  当前月最后一天
    DataTime theEndDataOfMonth = dateTime.dayOfMonth().withMaximumValue();
    
    // 这一天是几号
    int day = dateTime.getDayOfMonth();
    // 这一天是哪月
    int month = dateTime.getMothOfYear();
    // 这一天是哪年
    int year = dateTime.getYear();
    // 判断本月是不是9月
    if(dateTime.getDayOfMonth() == DateTimeConstants.SEPTEMBER){
    //TODO
    }
    
    // 获取相对于当前时间的月份,比如获取上个月的时间或者下个月的是时间,方法minusMoths接受一个int的参数,如果这个参数等于0,代表本月,大于0代表已经过去的时间,小于0代表还没有到来的时间
     LocalDate lastDayOfMonth = new LocalDate().minusMonths(1).dayOfMonth().withMaximumValue();
    

    2、关于星期的操作

    DateTime dateTime = new DateTime();
    // 今天是星期几
    int week = dateTime.getDayOfWeek();
    // 判断今天是不是星期日
    if(dateTime.getDayOfWeek() == DateTimeConstants.SUNDAY){
        // TODO
    }
    
    提示:DateTimeConstants中包含了许多你需要的常量,而不用你自己去定义,比如星期、月份、上午还是下午等等

    3、计算时间差

    注意开始时间与结束时间参数位置,如果开始时间小于结束时间,得到的天数是正数,否则就是负数!

    DateTime currentDateTime = new DateTime();
    DateTime targetDateTime = new DateTime(2017,10,1,0,0,0);
    
    // 相差多少年
    int years = Years.yearsBetween(currentDateTime,targetDateTime).getYears();
    // 相差多少月
    int months = Months.monthsBetween(currentDateTime,targetDateTime).getMonths();
    // 距离国庆放假还有多少天,嘎嘎!
    int days = Days.daysBetween(currentDateTime,targetDateTime).getDays();
    // 相差多少小时
    int hours = Hours.hoursBetween(currentDateTime,targetDateTime).getHours();
    // 相差多少分钟
    int minutes = Minutes.minutesBetween(currentDateTime,targetDateTime).getMinutes();
    // 相差多少秒
    int seconds = Seconds.secondsBetween(currentDateTime,targetDateTime).getSeconds();
    // 相差多少周
    int weeks = Weeks.weeksBetween(currentDateTime,targetDateTime).getWeeks();
    

    4、获取零点相关的时间

    DateTime currentDateTime = new DateTime();
    // 今天的零点
    DateTime dateTime = currentDateTime.withMillisOfDay(0);
    // 昨天的零点
    DateTime dateTime = currentDateTime.withMillisOfDay(0).plusDays(-1);
    // 明天的零点
    DateTime dateTime = currentDateTime.withMillisOfDay(0).plusDays(1);
    // 这一年最后一天0点
    new DateTime().dayOfYear().withMaximumValue().withMillisOfDay(0)
    // 这一年第一天0点
    new DateTime().dayOfYear().withMinimumValue().withMillisOfDay(0)
    // 这个月最后一天0点
    new DateTime().dayOfMonth().withMaximumValue().withMillisOfDay(0)
    // 这个月月初0点
    new DateTime().dayOfMonth().withMinimumValue().withMillisOfDay(0)
    
    提示:要获取多少天后或者多少天前的零点,只需在plusDays()方法中填写相应参数即可

    三、准确使用Joda Time的时间处理类

    1、格式化日期时间

    // 格式化时间
    DateTime currentDateTime = new DateTime();
    currentDateTime.toString("yyyy-MM-dd HH:mm:ss");
    
    // 指定时区格式化
    String format = "yyyy-MM-dd HH:mm:ss";
    DateTime dateTime = new DateTime();
    dateTime.toString(format, Locale.US);
    
    // 格式化时分秒(单位毫秒并且最大可格式23:59:59,超出将报错)
    int millis = 120000;
    LocalTime localTime = new LocalTime().withMillisOfDay(millis);
    localTime.toString("HH:mm:ss");
    

    2、LocalDate和LocalTime

    如果业务只需要日期,请使用LocalDate,因为LocalDate仅仅关心日期,更专业,也减少了不必要的资源消耗;如果业务只关心时间,那么使用LocalTime

    LocalDate localDate = new LocalDate();
    LocalTime localTime = new LocalTime();
    System.out.println(localDate);
    // 2021-08-16
    System.out.println(localTime);
    //15:30:18.520
    

    4、LocalDateTime

    如果业务需要日期时间都要使用,那么可以使用LocalDateTime, DateTime这两个类,它们都是线程安全的同时都是不可变的,使用起来不用担心出问题。

    • LocalDateTime是与时区无关的。
    • DateTime是与时区相关的一个国际标准时间。
    • 使用的时候根据自己的需要选择,详细的解释可以参考官方文档!

    附录:DateTimeConstants类的常量

    // 月份
    public static final int JANUARY = 1;
    public static final int FEBRUARY = 2;
    public static final int MARCH = 3;
    public static final int APRIL = 4;
    public static final int MAY = 5;
    public static final int JUNE = 6;
    public static final int JULY = 7;
    public static final int AUGUST = 8;
    public static final int SEPTEMBER = 9;
    public static final int OCTOBER = 10;
    public static final int NOVEMBER = 11;
    public static final int DECEMBER = 12;
    // 星期
    public static final int MONDAY = 1;
    public static final int TUESDAY = 2;
    public static final int WEDNESDAY = 3;
    public static final int THURSDAY = 4;
    public static final int FRIDAY = 5;
    public static final int SATURDAY = 6;
    public static final int SUNDAY = 7;
    // 上午&下午
    public static final int AM = 0;
    public static final int PM = 1;
    // 公元前...年(基督之前...年)
    public static final int BC = 0;
    // 公元前
    public static final int BCE = 0;
    // 公元...年(原义为主的纪年)
    public static final int AD = 1;
    // 基督纪元,公元
    public static final int CE = 1;
    // 1秒对应毫秒数
    public static final int MILLIS_PER_SECOND = 1000;
    // 1分钟对应秒数
    public static final int SECONDS_PER_MINUTE = 60;
    // 1分钟对应毫秒数
    public static final int MILLIS_PER_MINUTE = 60000;
    // 1小时对应分钟数
    public static final int MINUTES_PER_HOUR = 60;
    // 1小时对应的秒数
    public static final int SECONDS_PER_HOUR = 3600;
    // 1小时对应的毫秒数
    public static final int MILLIS_PER_HOUR = 3600000;
    // 1天对应的小时
    public static final int HOURS_PER_DAY = 24;
    // 1天对应的分钟数
    public static final int MINUTES_PER_DAY = 1440;
    // 1天对应的秒数
    public static final int SECONDS_PER_DAY = 86400;
    // 1天对应的毫秒数
    public static final int MILLIS_PER_DAY = 86400000;
    // 1周对应的天数
    public static final int DAYS_PER_WEEK = 7;
    // 1周对应的小时
    public static final int HOURS_PER_WEEK = 168;
    // 1周对应的分钟
    public static final int MINUTES_PER_WEEK = 10080;
    // 1周对应的秒数
    public static final int SECONDS_PER_WEEK = 604800;
    // 1周对应的毫秒数
    public static final int MILLIS_PER_WEEK = 604800000;
    

    以上就是Joda-Time处理Java中的日期时间更简便高效的内容介绍,更多的操作与使用还是要参考官方文档学习最为有效。


    版权声明:本站所有文章,如无特殊说明,均为本站原创。全部下载资源版权归原作者所有。任何个人或组织,若未征得本站同意,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。若需转载请注明文章来源。
    本文链接:Joda-Time处理Java中的日期时间更简便高效
    喜欢 (2)
    请潘老师喝杯Coffee吧!】
    分享 (0)
    用户头像
    发表我的评论
    取消评论
    表情 贴图 签到 代码

    Hi,您需要填写昵称和邮箱!

    • 昵称【必填】
    • 邮箱【必填】
    • 网址【可选】

    您也可以 微信登录 来发表评论!

    (1) 个小伙伴在畅所欲言
    1. 用户头像
      总结的很全面啊,很实用,收藏了
      大数据 2021-08-19 22:16 回复
    韩国毛茸茸的丰满妇女