Java中joda日期格式化工具的使用示例

1.基本介绍

Java自带日期格式化工具DateFormat ,但是DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中使用,如 将 SimpleDateFormat 限制在 ThreadLocal 中。如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。因此,从日期、时间处理的所有实践来说,我强力推荐使用joda-time 库。

2.joda-time的使用

引入依赖

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

编写测试类

public class DateUtils {

  public static final long SECOND = 1000; // 1秒 java已毫秒为单位

  public static final long MINUTE = SECOND * 60; // 一分钟

  public static final long HOUR = MINUTE * 60; // 一小时

  public static final long DAY = HOUR * 24; // 一天

  public static final long WEEK = DAY * 7; // 一周

  public static final long YEAR = DAY * 365; // 一年

  public static final String FORMAT_TIME = "yyyy-MM-dd HH:mm:ss"; // 默认时间格式

  public static final String FORMAT_TIME_MINUTE = "yyyy-MM-dd HH:mm"; // 默认时间格式

  public static final String FORTER_DATE = "yyyy-MM-dd"; // 默认日期格式

  private static final Map<Integer, String> WEEK_DAY = new HashMap<Integer, String>();
  static {
    WEEK_DAY.put(7, "星期六");
    WEEK_DAY.put(1, "星期天");
    WEEK_DAY.put(2, "星期一");
    WEEK_DAY.put(3, "星期二");
    WEEK_DAY.put(4, "星期三");
    WEEK_DAY.put(5, "星期四");
    WEEK_DAY.put(6, "星期五");
  }

  /**
   * 获取当前系统时间
   *
   * @return yyyy-MM-dd HH:mm:ss
   */
  public static String getCurrentTime() {
    DateTime dt = new DateTime();
    String time = dt.toString(FORMAT_TIME);
    return time;
  }

  /**
   * 获取系统当前时间按照指定格式返回
   *
   * @param pattern
   *      yyyy/MM/dd hh:mm:a
   * @return
   */
  public static String getCurrentTimePattern(String pattern) {
    DateTime dt = new DateTime();
    String time = dt.toString(pattern);
    return time;
  }

  /**
   * 获取当前日期
   *
   * @return
   */
  public static String getCurrentDate() {
    DateTime dt = new DateTime();
    String date = dt.toString(FORTER_DATE);
    return date;
  }

  /**
   * 获取当前日期按照指定格式
   *
   * @param pattern
   * @return
   */
  public static String getCurrentDatePattern(String pattern) {
    DateTime dt = new DateTime();
    String date = dt.toString(pattern);
    return date;
  }

  /**
   * 按照时区转换时间
   *
   * @param date
   * @param timeZone
   *      时区
   * @param parrten
   * @return
   */
  @Nullable
  public static String format(Date date, TimeZone timeZone, String parrten) {
    if (date == null) {
      return null;
    }
    SimpleDateFormat sdf = new SimpleDateFormat(parrten);
    sdf.setTimeZone(timeZone);
    return sdf.format(date);
  }

  /**
   * 获取指定时间
   *
   * @param year
   *      年
   * @param month
   *      月
   * @param day
   *      天
   * @param hour
   *      小时
   * @param minute
   *      分钟
   * @param seconds
   *      秒
   * @return yyyy-MM-dd HH:mm:ss
   */
  public static String getPointTime(Integer year, Integer month, Integer day, Integer hour, Integer minute,
      Integer seconds) {
    DateTime dt = new DateTime(year, month, day, hour, minute, seconds);
    String date = dt.toString(FORMAT_TIME);
    return date;
  }

  /**
   *
   * @param year
   *      年
   * @param month
   *      月
   * @param day
   *      天
   * @param hour
   *      小时
   * @param minute
   *      分钟
   * @param seconds
   *      秒
   * @param parrten
   *      自定义格式
   * @return parrten
   */
  public static String getPointTimePattern(Integer year, Integer month, Integer day, Integer hour, Integer minute,
      Integer seconds, String parrten) {
    DateTime dt = new DateTime(year, month, day, hour, minute, seconds);
    String date = dt.toString(parrten);
    return date;
  }

  /**
   * 获取指定日期
   *
   * @param year
   * @param month
   * @param day
   * @return
   */
  public static String getPointDate(Integer year, Integer month, Integer day) {
    LocalDate dt = new LocalDate(year, month, day);
    String date = dt.toString(FORTER_DATE);
    return date;
  }

  /**
   * 获取指定日期 返回指定格式
   *
   * @param year
   * @param month
   * @param day
   * @param parrten
   * @return
   */
  public static String getPointDatParrten(Integer year, Integer month, Integer day, String parrten) {
    LocalDate dt = new LocalDate(year, month, day);
    String date = dt.toString(parrten);
    return date;
  }

  /**
   * 获取当前是一周星期几
   *
   * @return
   */
  public static String getWeek() {
    DateTime dts = new DateTime();
    String week = null;
    switch (dts.getDayOfWeek()) {
    case DateTimeConstants.SUNDAY:
      week = "星期日";
      break;

    case DateTimeConstants.MONDAY:
      week = "星期一";
      break;

    case DateTimeConstants.TUESDAY:
      week = "星期二";
      break;
    case DateTimeConstants.WEDNESDAY:
      week = "星期三";
      break;
    case DateTimeConstants.THURSDAY:
      week = "星期四";
      break;
    case DateTimeConstants.FRIDAY:
      week = "星期五";
      break;
    case DateTimeConstants.SATURDAY:
      week = "星期六";
    default:
      break;
    }
    return week;
  }

  /**
   * 获取指定时间是一周的星期几
   *
   * @param year
   * @param month
   * @param day
   * @return
   */
  public static String getWeekPoint(Integer year, Integer month, Integer day) {
    LocalDate dts = new LocalDate(year, month, day);
    String week = null;
    switch (dts.getDayOfWeek()) {
    case DateTimeConstants.SUNDAY:
      week = "星期日";
      break;
    case DateTimeConstants.MONDAY:
      week = "星期一";
      break;
    case DateTimeConstants.TUESDAY:
      week = "星期二";
      break;
    case DateTimeConstants.WEDNESDAY:
      week = "星期三";
      break;
    case DateTimeConstants.THURSDAY:
      week = "星期四";
      break;
    case DateTimeConstants.FRIDAY:
      week = "星期五";
      break;
    case DateTimeConstants.SATURDAY:
      week = "星期六";
      break;

    default:
      break;
    }
    return week;
  }

  /**
   * 格式化日期
   *
   * @param date
   * @return yyyy-MM-dd HH:mm:ss
   */
  @Nullable
  public static String format(Date date) {
    if (date == null) {
      return null;
    }
    SimpleDateFormat format = new SimpleDateFormat(FORMAT_TIME);
    return format.format(date);
  }

  /**
   * 格式化日期字符串
   *
   * @param date
   *      日期
   * @param pattern
   *      日期格式
   * @return
   */
  @Nullable
  public static String format(Date date, String pattern) {
    if (date == null) {
      return null;
    }
    SimpleDateFormat format = new SimpleDateFormat(pattern);
    return format.format(date);
  }

  /**
   * 解析日期
   *
   * @param date
   *      日期字符串
   * @param pattern
   *      日期格式
   * @return
   */
  @Nullable
  public static Date parse(String date, String pattern) {
    if (date == null) {
      return null;
    }
    Date resultDate = null;
    try {
      resultDate = new SimpleDateFormat(pattern).parse(date);
    } catch (ParseException e) {

    }
    return resultDate;
  }

  /**
   * 解析日期yyyy-MM-dd HH:mm:ss
   *
   * @param date
   *      日期字符串
   * @return
   */
  @Nullable
  public static Date parse(String date) {
    if (date == null) {
      return null;
    }

    try {
      return new SimpleDateFormat(FORMAT_TIME).parse(date);
    } catch (ParseException e) {
      return null;
    }
  }

  /**
   * 解析日期 yyyy-MM-dd HH:mm:ss
   *
   * @param timestamp
   * @return
   */
  public static String format(Long timestamp, String pattern) {
    String dateStr = "";
    if (null == timestamp || timestamp.longValue() < 0) {
      return dateStr;
    }
    try {
      Date date = new Date(timestamp);
      SimpleDateFormat format = new SimpleDateFormat(pattern);
      dateStr = format.format(date);
    } catch (Exception e) {
      // ignore
    }

    return dateStr;
  }

  /**
   * 解析日期 yyyy-MM-dd HH:mm:ss
   *
   * @param timestamp
   * @return
   */
  public static String format(Long timestamp) {
    String dateStr = "";
    if (null == timestamp || timestamp.longValue() < 0) {
      return dateStr;
    }
    try {
      Date date = new Date(timestamp);
      SimpleDateFormat format = new SimpleDateFormat(FORMAT_TIME);
      dateStr = format.format(date);
    } catch (Exception e) {
      // ignore
    }

    return dateStr;
  }

  /**
   * 获取当前时间前几天时间,按指定格式返回
   *
   * @param days
   * @return
   */
  public static String forwardDay(Integer days, String format) {
    DateTime dt = new DateTime();
    DateTime y = dt.minusDays(days);
    return y.toString(format);
  }

  /**
   * 获取当前时间前几天时间
   *
   * @param days
   * @return
   */
  public static Date forwardDay(Integer days) {
    DateTime dt = new DateTime();
    DateTime y = dt.minusDays(days);
    return y.toDate();
  }

  /**
   * 获取指定时间之后或者之前的某一天00:00:00 默认返回当天
   *
   * @param days
   * @return
   */
  public static Date day00(Integer days, String date, String zimeZone) throws Throwable {
    DateTime dt;
    TimeZone timeZone;
    try {
      if (isBlank(zimeZone)) {
        timeZone = TimeZone.getDefault();
      } else {
        timeZone = TimeZone.getTimeZone(zimeZone);
      }
      if (isBlank(date)) {
        dt = new DateTime().withZone(DateTimeZone.forTimeZone(timeZone)).toLocalDateTime().toDateTime();
      } else {
        dt = new DateTime(date).withZone(DateTimeZone.forTimeZone(timeZone)).toLocalDateTime().toDateTime();
      }
    } catch (Exception e) {
      throw new Throwable(e);
    }

    DateTime y = dt.minusDays(days).withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0);
    return y.toDate();
  }

  /**
   * 获取指定时间之后或者之前的某一天23:59:59 默认返回当天
   *
   * @param days
   *      偏移量
   * @return
   */
  public static Date day59(Integer days, String date, String zimeZone) throws Throwable {
    DateTime dt;
    TimeZone timeZone;
    try {
      if (isBlank(zimeZone)) {
        timeZone = TimeZone.getDefault();
      } else {
        timeZone = TimeZone.getTimeZone(zimeZone);
      }
      if (isBlank(date)) {

        dt = new DateTime().withZone(DateTimeZone.forTimeZone(timeZone)).toLocalDateTime().toDateTime();
      } else {
        dt = new DateTime(date).withZone(DateTimeZone.forTimeZone(timeZone)).toLocalDateTime().toDateTime();
      }
    } catch (Exception e) {
      throw new Throwable(e);
    }
    DateTime y = dt.minusDays(days).withHourOfDay(23).withMinuteOfHour(59).withSecondOfMinute(59);
    return y.toDate();
  }

  /**
   * 计算两个时间相差多少天
   *
   * @param startDate
   * @param endDate
   * @return
   */
  @Nullable
  public static Integer diffDay(Date startDate, Date endDate) {
    if (startDate == null || endDate == null) {
      return null;
    }
    DateTime dt1 = new DateTime(startDate);
    DateTime dt2 = new DateTime(endDate);
    int day = Days.daysBetween(dt1, dt2).getDays();
    return Math.abs(day);
  }

  /**
   * 获取某月之前,之后某一个月最后一天,24:59:59
   *
   * @return
   */
  public static Date lastDay(Date date, Integer month) {
    DateTime dt1;
    if (month == null) {
      month = 0;
    }
    if (date == null) {
      dt1 = new DateTime().minusMonths(month);
    } else {
      dt1 = new DateTime(date).minusMonths(month);
    }
    DateTime lastDay = dt1.dayOfMonth().withMaximumValue().withHourOfDay(23).withMinuteOfHour(59)
        .withSecondOfMinute(59);
    return lastDay.toDate();
  }

  /**
   * 获取某月月之前,之后某一个月第一天,00:00:00
   *
   * @return
   */
  public static Date firstDay(Date date, Integer month) {
    DateTime dt1;
    if (month == null) {
      month = 0;
    }
    if (date == null) {
      dt1 = new DateTime().minusMonths(month);
    } else {
      dt1 = new DateTime(date).minusMonths(month);
    }
    DateTime lastDay = dt1.dayOfMonth().withMinimumValue().withHourOfDay(0).withMinuteOfHour(0)
        .withSecondOfMinute(0);
    return lastDay.toDate();
  }

  public static Date addDay(Date date, int offset) {
    DateTime dt1;
    if (date == null) {
      dt1 = new DateTime().plusDays(offset);
      return dt1.toDate();
    }
    dt1 = new DateTime(date).plusDays(offset);
    return dt1.toDate();

  }

  /**
   * 传入日期时间与当前系统日期时间的比较, 若日期相同,则根据时分秒来返回 , 否则返回具体日期
   *
   * @return 日期或者 xx小时前||xx分钟前||xx秒前
   */
  @Nullable
  public static String getNewUpdateDateString(Date now, Date createDate) {
    if (now == null || createDate == null) {
      return null;
    }
    Long time = (now.getTime() - createDate.getTime());
    if (time > (24 * 60 * 60 * 1000)) {
      return time / (24 * 60 * 60 * 1000) + "天前";
    } else if (time > (60 * 60 * 1000)) {
      return time / (60 * 60 * 1000) + "小时前";
    } else if (time > (60 * 1000)) {
      return time / (60 * 1000) + "分钟前";
    } else if (time >= 1000) {
      return time / 1000 + "秒前";
    }
    return "刚刚";
  }
  /**
   *
   * @Title: isBlank
   * @Description: TODO(判断字符串是否为空或长度为0 或由空格组成)
   * @param @param str
   * @param @return 设定文件
   * @return boolean 返回类型
   * @throws
   */
  public static boolean isBlank(String str) {
    return (str == null || str.trim().length() == 0);
  }

  public static void main(String[] args) throws Throwable {
     System.out.println(lastDay(new Date(),2));
     System.out.println(firstDay(null,0));
     TimeZone zone1=TimeZone.getTimeZone("GMT+8");
     TimeZone zone2=TimeZone.getTimeZone("GMT-5");
     System.out.println(format(new Date(),zone1,FORMAT_TIME));
     System.out.println(format(new Date(),zone2,FORMAT_TIME));

     System.out.println(format(day00(0,"2017-5-11","GMT+0")));
     System.out.println(format(day00(0,"2017-5-11","GMT+8")));
     System.out.println(format(day00(0,"2017-5-11","GMT-8")));
     Date date1 =parse("2017-05-11 17:53:52");

     System.out.println(diffDay(date1,new Date()));

     DateTime dateTime = new DateTime().withDayOfWeek(1);

     DateTime dateTime1 = new DateTime().withDayOfWeek(7).withTime(0, 0,
     0, 0);
     System.out.println(format(dateTime.toDate()));

     System.out.println(format(dateTime1.toDate()));

    System.out.println(format(new Date(), "MM/dd"));
  }

}

优点

1. 易于使用:Calendar让获取"正常的"的日期变得很困难,使它没办法提供简单的方法,而Joda-Time能够 直接进行访问域并且索引值1就是代表January。
2. 易于扩展:JDK支持多日历系统是通过Calendar的子类来实现,这样就显示的非常笨重而且事实 上要实现其它日历系统是很困难的。Joda-Time支持多日历系统是通过基于Chronology类的插件体系来实现。

3. 提供一组完整的功能:它打算提供 所有关系到date-time计算的功能.Joda-Time当前支持8种日历系统,而且在将来还会继续添加,有着比JDK Calendar更好的整体性能等等。

以上就是Java中joda日期格式化工具的使用示例的详细内容,更多关于java 日期格式化工具的资料请关注我们其它相关文章!

(0)

相关推荐

  • java中日期格式化的大坑

    前言 我们都知道在java中进行日期格式化使用simpledateformat.通过格式 yyyy-MM-dd 等来进行格式化,但是你知道其中微小的坑吗? yyyy 和 YYYY 示例代码 @Test public void testWeekBasedYear() { Calendar calendar = Calendar.getInstance(); // 2019-12-31 calendar.set(2019, Calendar.DECEMBER, 31); Date strDate1

  • java正则实现各种日期格式化

    java正则实现各种日期格式化 package com.st.test; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.regex.Pattern; public class DateFormatUtil { @SuppressWarnings("finally") publ

  • java日期格式化SimpleDateFormat的使用详解

    日期和时间格式由 日期和时间模式字符串 指定.在 日期和时间模式字符串 中,未加引号的字母 'A' 到 'Z' 和 'a' 到 'z' 被解释为模式字母,用来表示日期或时间字符串元素.文本可以使用单引号 (') 引起来,以免进行解释.所有其他字符均不解释:只是在格式化时将它们简单复制到输出字符串 白话文的讲:这些A--Z,a--z这些字母(不被单引号包围的)会被特殊处理替换为对应的日期时间,其他的字符串还是原样输出. 日期和时间模式(注意大小写,代表的含义是不同的) yyyy:年 MM:月 dd

  • 与众不同的 Java 日期格式化大全

    前言 在 Java 中,经常要将时间字符串转换为日期,或者要将日期转换为时间字符串.这种操作一般都是用 java.text.SimpleDateFormat 类处理.例如要将日期转换为时间字符串,那么就用下面的代码. new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) 得到的结果是 2018-11-25 17:57:40 其中 "yyyy-MM-dd HH:mm:ss" 这部分叫做时间模式,是

  • Java中日期格式化YYYY-DD的操作bug

    写这篇博文是记录下跨年的bug.去年隔壁组的小伙伴就是计算两个日期之间间隔的天数,因为跨年的原因计算有误. 当时测试组的小姐姐也没有模拟出来这种场景,导致上生产环境直接影响线上的数据. 今天逛技术论论坛正好遇到Java日期的操作bug. 1 yyyy 和 YYYY 别看字,看代码 @Test public void testWeekBasedYear() { Calendar calendar = Calendar.getInstance(); // 2019-12-31 calendar.se

  • Golang中使用Date进行日期格式化(沿用Java风格)

    本文介绍了Golang中使用Date进行日期格式化,分享给大家,具体如下: Github https://github.com/noogo/date Date Date是一个基于time包装的一个日期包,通过此包可以快速创建日期.获取时间戳.毫秒数及最重要的日期格式化,另外你还可以继续使用time包下的所有函数(除time.Foramt(string)外)你可以通过以下方法快速创建一个Date对象: Now() WithTime(t time.Time) WithTimestamp(timest

  • Java中joda日期格式化工具的使用示例

    1.基本介绍 Java自带日期格式化工具DateFormat ,但是DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中使用,如 将 SimpleDateFormat 限制在 ThreadLocal 中.如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果.因此,从日期.时间处理的所有实践来说,我强力推荐使用joda-time 库. 2.joda-time的使用 引入依赖 <de

  • Java 中DateUtils日期工具类的实例详解

    Java 中DateUtils日期工具类的实例详解 介绍 在java中队日期类型的处理并不方便,通常都需要借助java.text.SimpleDateFormat类来实现日期类型 和字符串类型之间的转换,但是在jdk1.8之后有所改善,jdk1.7以及之前的版本处理日期类型并不方便, 可以借助Joda Time组件来处理,尤其是日期类型的一些数学操作就更是不方便. java代码 /** * * 日期工具类 java对日期的操作一直都很不理想,直到jdk1.8之后才有了本质的改变. * 如果使用的

  • 详解在java中进行日期时间比较的4种方法

    1. Date.compareTo() java.util.Date提供了在Java中比较两个日期的经典方法compareTo(). 如果两个日期相等,则返回值为0. 如果Date在date参数之后,则返回值大于0. 如果Date在date参数之前,则返回值小于0. @Test void testDateCompare() throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

  • JAVA中的日期时间类用法总结

    前言 好记性不如烂笔头,日期时间类那么花哨不如记下来多看两眼. 提示:以下是本篇文章正文内容,下面案例可供参考 一.日期时间类的包 代码如下(示例): java.util.Date; java.time.format.DateTimeFormatter; java.util.Calendar java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.tim

  • 详解Java中的日期类

    Java 编程语言中时间的处理类有 Date类与 Calendar类.目前官方不推荐使用 Date类,因为其不利于国际化:而是推荐使用 Calendar类,并使用 DateFormat 类做格式化处理. 一.Date 类介绍 Date 表示特定的瞬间,精确到毫秒. 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年.月.日.小时.分钟和秒值.它也允许格式化和解析日期字符串. 不过,这些函数的 API 不易于实现国际化.从 JDK 1.1 开始,应该使用 Calenda

  • Java中LinkedList详解和使用示例_动力节点Java学院整理

    第1部分 LinkedList介绍 LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作. LinkedList 实现 List 接口,能对它进行队列操作. LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用. LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆. LinkedList 实现java.io.Serial

  • Java中的日期和时间类以及Calendar类用法详解

    Java日期和时间类简介 Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类,其构造方法比较多,下面是常用的两个: Date():使用当前的日期和时间初始化一个对象. Date(long millisec):从1970年01月01日00时(格林威治时间)开始以毫秒计算时间,计算 millisec 毫秒.如果运行 Java 程序的本地时区是北京时区(

  • Java中生成唯一ID的方法示例

    有时我们不依赖于数据库中自动递增的字段产生唯一ID,比如多表同一字段需要统一一个唯一ID,这时就需要用程序来生成一个唯一的全局ID. UUID 从Java 5开始, UUID 类提供了一种生成唯一ID的简单方法.UUID是通用唯一识别码 (Universally Unique Identifier)的缩写,UUID来源于OSF(Open Software Foundation,开源软件基金会)的DCE(Distributed Computing Environment,分布式计算环境)规范.UU

  • java中BigDecimal和0比较的示例代码

    BigDecimal 和 0 比较大小 调用BigDecimal中的compareTo方法, 如: int i = bigDecimal.compareTo(BigDecimal.Zero); i=0:表示bigDecimal的值  等于 0 i=1:表示bigDecimal的值与 大于0 i=-1:表示bigDecimal的值与 小于 0 参考案例 BigDecimal num= new BigDecimal("18"); int i=num.compareTo(BigDecimal

  • Java中使用Lambda表达式和函数编程示例

    目录 1.简单介绍 2.Lambdas和Scopes 3.Lambdas与局部变量 4.Lambda体与局部变量 5.Lambdas和'This'和'Super'关键字 6.Lambdas和Exceptions 7.预定义的功能接口 1.简单介绍 第一个示例演示变量声明上下文中的lambda.它将lambda()->{System.out.println("running"):}分配给可运行接口类型的变量r. 第二个示例类似,但演示了赋值上下文中的lambda(到先前声明的变量r

随机推荐