在编写企业应用程序时,常常需要处理日期。用 Java.util.Calendar
不是太直观方便。如果您也曾使用这个类处理过日期/时间值,那么您就知道它使用起来有多麻烦。 Joda-Time — 面向 Java 应用程序的日期/时间库的替代选择。
Joda-Time 令时间和日期值变得易于管理、操作和理解。事实上,易于使用是 Joda 的主要设计目标。其他目标包括可扩展性、完整的特性集以及对多种日历系统的支持。并且 Joda 与 JDK 是百分之百可互操作的,因此您无需替换所有 Java 代码,只需要替换执行日期/时间计算的那部分代码。
maven的pom.xml
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.9.9</version> </dependency>案例代码:
import org.joda.time.*; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; /** * Created by ZHOUPENGCHENG390 on 2017/7/28. */ public class TestJoda { private static final String FORMATE_DATE = "yyyy/MM/dd"; private static final String FORMATE_SECONDS = "HH:mm:ss"; private static final String FORMATE_FULL = FORMATE_DATE.concat(" ").concat(FORMATE_SECONDS); public static void main(String[] args) { // 当前周的周一,周日 System.out.println(String.format("min:%s, max:%s", DateTime.now().dayOfWeek().withMinimumValue().toString("yyyy-MM-dd"), DateTime.now().dayOfWeek().withMaximumValue().toString("yyyy-MM-dd"))); // 当前月的第一天和最后一天 System.out.println(String.format("min:%s, max:%s", DateTime.now().dayOfMonth().withMinimumValue().toString(FORMATE_FULL), DateTime.now().dayOfMonth().withMaximumValue().toString(FORMATE_FULL))); // 当前年的第一天和最后一天 System.out.println(String.format("min:%s, max:%s", DateTime.now().dayOfYear().withMinimumValue().toString("yyyy-MM-dd"), DateTime.now().dayOfYear().withMaximumValue().toString("yyyy-MM-dd"))); //常用方法 DateTime start = new DateTime(2017, 7, 28, 15, 00, 00); System.out.println("start:" + start.toString(FORMATE_DATE)); DateTime now = DateTime.now(); System.out.println("now:" + now.toString(FORMATE_FULL)); System.out.println("now format with Locale.CHINESE:" + now.toString(FORMATE_FULL, Locale.CHINESE)); System.out.println("before now 1 hours:" + now.minusHours(1).toString(FORMATE_FULL)); System.out.println("after now 1 hours:" + now.plusHours(1).toString(FORMATE_FULL)); System.out.println("before now 10 days:" + now.minusDays(10).toString(FORMATE_FULL)); System.out.println("after now 30 days:" + now.plusDays(30).toString(FORMATE_FULL)); System.out.println("before " + start.toString("yyyyMMddHHmmssSSS") + " 1 days:" + start.minusDays(1).toString("yyyyMMddHHmmssSSS")); Duration duration = new Duration(start, now); System.out.println("duration.getStandardDays(): " + start.toString(FORMATE_FULL) + " 与 " + now.toString(FORMATE_FULL) + " 相差的天数:" + duration.getStandardDays()); System.out.println("duration.getStandardHours(): " + start.toString(FORMATE_FULL) + " 与 " + now.toString(FORMATE_FULL) + " 相差的小时数:" + duration.getStandardHours()); System.out.println("================================================================"); Calendar calendar = now.toCalendar(Locale.CHINESE); System.out.println("with JDK interact:" + new SimpleDateFormat(FORMATE_DATE).format(calendar.getTime())); Calendar calendar1 = Calendar.getInstance(); System.out.println("Calendar:" + new SimpleDateFormat(FORMATE_DATE).format(calendar1.getTime())); DateTime a = new DateTime(new Date()); System.out.println("格式化:" + a.toString(FORMATE_DATE, Locale.CHINESE)); DateTime b = new DateTime(2014, 1, 1, 0, 0); System.out.println("格式化:" + b.toString(FORMATE_DATE, Locale.CHINESE)); String timeString = "2016-02-21"; DateTime c = new DateTime(timeString); System.out.println("parse:" + c.toString(FORMATE_DATE, Locale.CHINESE)); LocalDate localDate = new LocalDate(2009, 9, 6);// September 6, 2009 System.out.println("LocalDate:" + localDate.toString(FORMATE_DATE, Locale.CHINESE)); LocalTime localTime = new LocalTime(13, 30, 26, 0);// 1:30:26PM System.out.println("LocalTime:" + localTime.toString("HH:mm:ss", Locale.CHINESE)); LocalDate d = LocalDate.now(); LocalDate lastDayOfPreviousMonth = d.minusMonths(1).dayOfMonth().withMaximumValue(); System.out.println("上一个月的最后一天:" + lastDayOfPreviousMonth.toString(FORMATE_DATE, Locale.CHINESE)); LocalDate.Property e = d.minusWeeks(1).dayOfWeek(); System.out.println("上周的周一:" + e.withMinimumValue().toString(FORMATE_DATE, Locale.CHINESE)); System.out.println("上周的周日:" + e.withMaximumValue().toString(FORMATE_DATE)); System.out.println("================================================================"); System.out.println("dayOfWeek().getAsText(Locale.CHINESE)今天星期几:" + a.dayOfWeek().getAsText(Locale.CHINESE)); System.out.println("dayOfWeek().getAsText(Locale.CHINESE)今天几号:" + a.dayOfMonth().getAsText(Locale.CHINESE)); System.out.println("dayOfWeek().getAsText(Locale.CHINESE)今天几月:" + a.monthOfYear().getAsText(Locale.CHINESE)); System.out.println(".dayOfWeek().getAsText(Locale.CHINESE)去年的今天星期几:" + a.minusYears(1).dayOfWeek().getAsText(Locale.CHINESE)); System.out.println(".monthOfYear().getAsText(Locale.CHINESE)去年的今天是几月份:" + a.minusYears(1).monthOfYear().getAsText(Locale.CHINESE)); System.out.println(".dayOfMonth().getAsText(Locale.CHINESE)明年的今天是几号:" + a.plusYears(1).dayOfMonth().getAsText(Locale.CHINESE)); System.out.println("Days.daysBetween计算日期间隔:" + Days.daysBetween(DateTime.parse("2017-06-27"), DateTime.parse("2017-07-02")).getDays()); System.out.println("================================================================"); DateTime one = DateTime.parse("2016-07-27T14:25:11"); System.out.println(one.minuteOfDay()// 转换到 minuteOfDay .setCopy(17)// 设置 minuteOfDay 的数值为 17,也就是 17 分钟 .toString(FORMATE_FULL)); System.out.println(one.hourOfDay().setCopy(0).toString(FORMATE_FULL)); System.out.println(one.hourOfDay().addToCopy(3));// 在 hourOfDay 上面增加 3个小时 System.out.println("是否闰月:" + one.monthOfYear().isLeap());// 在"2014-06-27"减去4个月到"2014-02-27"// 转换到monthOfYear的模式.isLeap()// 是否闰月 // 对于给定日期 "2015-07-02" 得到该年2月的同一天,即:2015-02-02 DateTime srcDay = DateTime.parse("2015-07-02"); System.out.println("monthOfYear:"+srcDay.monthOfYear().getAsText(Locale.CHINESE));//年的月份 System.out.println(srcDay.monthOfYear().withMinimumValue().toString(FORMATE_DATE));//年的月份中最小的数值:一月 System.out.println(srcDay.monthOfYear().withMinimumValue().plusMonths(1).toString(FORMATE_DATE));// 在一月上面加上一个月,就是二月 String feb = srcDay.monthOfYear().withMinimumValue().plusMonths(1).toString(FORMATE_DATE); System.out.println("with " + srcDay.toString(FORMATE_DATE) + " to get " + feb); feb = srcDay.monthOfYear().setCopy(2).toString(FORMATE_DATE); System.out.println("with " + srcDay.toString(FORMATE_DATE) + " to get " + feb); feb = srcDay.monthOfYear().addToCopy(-5).toString(FORMATE_DATE); System.out.println("with " + srcDay.toString(FORMATE_DATE) + " to get " + feb); //找出2015年后10年内的闰年 for (int i = 0; i < 10; i++) { DateTime in = srcDay.plusYears(i); if (in.year().isLeap()) { System.out.println(in.toString("yyyy") + " 是闰年"); } } run(); } private static void run() { System.out.println("========================官网示例===================="); runInstant(); System.out.println(); runDateTime(); System.out.println(); } private static void runInstant() { System.out.println("Instant"); System.out.println("======="); System.out .println("Instant stores a point in the datetime continuum as millisecs from 1970-01-01T00:00:00Z"); System.out.println("Instant is immutable and thread-safe"); System.out.println(" in = new Instant()"); Instant in = new Instant(); System.out.println("Millisecond time: in.getMillis(): " + in.getMillis()); System.out.println("ISO string version: in.toString(): " + in.toString()); System.out.println("ISO chronology: in.getChronology(): " + in.getChronology()); System.out.println("UTC time zone: in.getDateTimeZone(): " + in.getZone()); System.out.println("Change millis: in.withMillis(0): " + in.withMillis(0L)); System.out.println(""); System.out.println("Convert to Instant: in.toInstant(): " + in.toInstant()); System.out.println("Convert to DateTime: in.toDateTime(): " + in.toDateTime()); System.out.println("Convert to MutableDT: in.toMutableDateTime(): " + in.toMutableDateTime()); System.out.println("Convert to Date: in.toDate(): " + in.toDate()); System.out.println(""); System.out.println(" in2 = new Instant(in.getMillis() + 10)"); Instant in2 = new Instant(in.getMillis() + 10); System.out.println("Equals ms and chrono: in.equals(in2): " + in.equals(in2)); System.out.println("Compare millisecond: in.compareTo(in2): " + in.compareTo(in2)); System.out.println("Compare millisecond: in.isEqual(in2): " + in.isEqual(in2)); System.out.println("Compare millisecond: in.isAfter(in2): " + in.isAfter(in2)); System.out.println("Compare millisecond: in.isBefore(in2): " + in.isBefore(in2)); } private static void runDateTime() { System.out.println("DateTime"); System.out.println("======="); System.out .println("DateTime stores a the date and time using millisecs from 1970-01-01T00:00:00Z internally"); System.out.println("DateTime is immutable and thread-safe"); System.out.println(" in = new DateTime()"); DateTime in = new DateTime(); System.out.println("Millisecond time: in.getMillis(): " + in.getMillis()); System.out.println("ISO string version: in.toString(): " + in.toString()); System.out.println("ISO chronology: in.getChronology(): " + in.getChronology()); System.out.println("Your time zone: in.getDateTimeZone(): " + in.getZone()); System.out.println("Change millis: in.withMillis(0): " + in.withMillis(0L)); System.out.println(""); System.out.println("Get year: in.getYear(): " + in.getYear()); System.out .println("Get monthOfYear: in.getMonthOfYear(): " + in.getMonthOfYear()); System.out.println("Get dayOfMonth: in.getDayOfMonth(): " + in.getDayOfMonth()); System.out.println("..."); System.out.println("Property access: in.dayOfWeek().get(): " + in.dayOfWeek().get()); System.out.println("Day of week as text: in.dayOfWeek().getAsText(): " + in.dayOfWeek().getAsText()); System.out.println("Day as short text: in.dayOfWeek().getAsShortText(): " + in.dayOfWeek().getAsShortText()); System.out.println("Day in french: in.dayOfWeek().getAsText(Locale.FRENCH):" + in.dayOfWeek().getAsText(Locale.FRENCH)); System.out.println("Max allowed value: in.dayOfWeek().getMaximumValue(): " + in.dayOfWeek().getMaximumValue()); System.out.println("Min allowed value: in.dayOfWeek().getMinimumValue(): " + in.dayOfWeek().getMinimumValue()); System.out.println("Copy & set to Jan: in.monthOfYear().setCopy(1): " + in.monthOfYear().setCopy(1)); System.out.println("Copy & add 14 months: in.monthOfYear().addCopy(14): " + in.monthOfYear().addToCopy(14)); System.out.println("Add 14 mnths in field:in.monthOfYear().addWrapFieldCopy(14): " + in.monthOfYear().addWrapFieldToCopy(14)); System.out.println("..."); System.out.println("Convert to Instant: in.toInstant(): " + in.toInstant()); System.out.println("Convert to DateTime: in.toDateTime(): " + in.toDateTime()); System.out.println("Convert to MutableDT: in.toMutableDateTime(): " + in.toMutableDateTime()); System.out.println("Convert to Date: in.toDate(): " + in.toDate()); System.out.println("Convert to Calendar: in.toCalendar(Locale.UK): " + in.toCalendar(Locale.UK).toString().substring(0, 46)); System.out.println("Convert to GregCal: in.toGregorianCalendar(): " + in.toGregorianCalendar().toString().substring(0, 46)); System.out.println(""); System.out.println(" in2 = new DateTime(in.getMillis() + 10)"); DateTime in2 = new DateTime(in.getMillis() + 10); System.out.println("Equals ms and chrono: in.equals(in2): " + in.equals(in2)); System.out.println("Compare millisecond: in.compareTo(in2): " + in.compareTo(in2)); System.out.println("Compare millisecond: in.isEqual(in2): " + in.isEqual(in2)); System.out.println("Compare millisecond: in.isAfter(in2): " + in.isAfter(in2)); System.out.println("Compare millisecond: in.isBefore(in2): " + in.isBefore(in2)); } }