Java开源 - Joda-Time:让日期处理更简单
AntHutt
8年前
<h2>简介</h2> <p>Joda-Time,一个面向 Java 平台的易于使用的开源时间/日期库。</p> <p>Joda-Time可以用来替换JDK的日期处理类,并且比 JDK中的时间类更加优秀。</p> <h2>使用</h2> <p>1、初始化</p> <p>DateTime 类作为最重要和最核心的一个类,</p> <p>Joda-Time 为它提供了丰富的初始化方式。</p> <p>注意:DateTime 一旦创建,时间值将不能更改。所有时间更改的操作会重 新返回一个新的DateTime。</p> <pre> <code class="language-nginx">DateTime dateTime;dateTime = new DateTime(); //以当前系统的毫秒级时间构建实例 dateTime = new DateTime(1481006233254L); //以毫秒级时间参数构建实例 dateTime = new DateTime("2016-11-22"); // 以String为参数构造实例 dateTime = new DateTime(2016,12,1,11,22,59); // 以 年.月.日.时.分.秒 构造实例 dateTime = new DateTime(2016,12,1,11,22,59,114); // 以 年.月.日.时.分.秒.毫秒 构造实例 dateTime = new DateTime(new Date()); // 以 JDK中Date为参数构造实例 dateTime = new DateTime(Calendar.getInstance()); // 以 JDK中Calendar为参数构造实例 dateTime = new DateTime(new DateTime()); // 以 DateTime本身为参数构造实例 // 注意:以上的每种实例化方式都可以在最后加上DateTimeZone参数来指定时区。 // 或者加上Chronology参数指定年表。 // 两个参数都不传或者传null,使用默认值 DateTimeFormatter format = DateTimeFormat .forPattern("yyyy-MM-dd HH:mm:ss"); // 通过DateTime的parse方法解析时间 DateTime dateTime = DateTime.parse("2016-12-1 14:22:45", format);</code></pre> <p>2、格式化输出</p> <p>比较复杂的写法是通过DateTimeFormatter 来格式化:</p> <pre> <code class="language-nginx">DateTime dateTime = new DateTime(); // 使用DateTimeFormatter 格式化日期 DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd"); // DateTimeFormatter 作为参数传到toString方法中 String time = dateTime.toString(fmt); // --> 输出: 2016-12-06</code></pre> <p>更加简便的方式:</p> <pre> <code class="language-nginx">// 更简单的方法 DateTime dateTime = new DateTime(); // toString方法有一个String类型参数的重载 String time = dateTime.toString("yyyy-MM-dd"); // --> 输出: 2016-12-06 // 既然如此,我们可以更方便输出更多格式 dateTime.toString("MM/dd/yyyy hh:mm:ss.SSSa"); dateTime.toString("dd-MM-yyyy HH:mm:ss"); dateTime.toString("EEEE dd MMMM, yyyy HH:mm:ssa"); dateTime.toString("MM/dd/yyyy HH:mm ZZZZ"); dateTime.toString("MM/dd/yyyy HH:mm Z");</code></pre> <p>3、日期的比较</p> <pre> <code class="language-nginx">DateTime dateTime = new DateTime("2014-11-22"); DateTime dateTime2 = new DateTime("2014-11-22"); DateTime dateTime3 = new DateTime("2015-12-25"); dateTime.isEqual(dateTime2); // true dateTime.isBefore(dateTime3); // true</code></pre> <p>比较的方法有 <strong>isEqual</strong> <strong>isBefore</strong> <strong>isAfter</strong> 。</p> <p>每个方法对应三种重载,同时还有和当前时间比较的方法:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/51c87e8a3eb078007dfea94a38b1c389.png"></p> <p>比较时间的方法</p> <p>4、日期的操作</p> <ul> <li> <p>设置日期</p> <p>设置日期的方法都是以with开头</p> <pre> <code class="language-nginx">// 初始化一个DateTime DateTime dateTime = new DateTime("2016-3-31"); dateTime.toString("yyyy-MM-dd hh:mm:ss");//2016-03-31 12:00:00 //将 年 设置为2014。 //前面说过,所有更改时间的操作都会返回新的DateTime //旧的DateTime 日期值不会改变 DateTime dateTime1 = dateTime.withYear(2014); dateTime1.toString("yyyy-MM-dd hh:mm:ss");//2014-03-31 12:00:00</code></pre> <p>设置时间属性的方法比较多,可以设置年月日、时分秒、时区等等。</p> <p>基本都是以with开头,比较直观。</p> <p> </p> </li> </ul> <ul> <li> <p>增加日期</p> <p>增加日期的方法都是以plus 开头</p> <pre> <code class="language-nginx">DateTime dateTime = new DateTime(); dateTime.toString("yyyy-MM-dd hh:mm:ss"); // 2016-12-06 03:15:07 // 当前时间基础上加上两天 DateTime dateTime2 = dateTime.plusDays(2); dateTime2.toString("yyyy-MM-dd hh:mm:ss"); // 2016-12-08 03:15:07</code></pre> <p>增加日期的方法还有不少,也比较直观:</p> </li> </ul> <p style="text-align:center"><img src="https://simg.open-open.com/show/6b8409d1cc84d7ee23851c0df55ab3bb.png"></p> <p>增加日期的方法</p> <ul> <li> <p>减少日期</p> <p>减少日期的方法都是以minus开头</p> <pre> <code class="language-nginx">DateTime dateTime = new DateTime(); dateTime.toString("yyyy-MM-dd hh:mm:ss"); //2016-12-06 03:20:45 // 减少五个月,并返回一个新的DateTime DateTime dateTime2 = dateTime.minusMonths(5); dateTime2.toString("yyyy-MM-dd hh:mm:ss"); //2016-07-06 03:20:45</code></pre> <p>更多减少日期方法:</p> </li> </ul> <p style="text-align:center"><img src="https://simg.open-open.com/show/7e1520f202c0577da94635b94e395199.png"></p> <p>减少日期方法</p> <p>5、获取日期属性</p> <ul> <li> <p>get方法获取</p> <p>通过get开头的方法,可以获取一些常用的属性</p> </li> </ul> <pre> <code class="language-nginx">DateTime dateTime = new DateTime("2016-3-31"); int dayOfWeek = dateTime.getDayOfWeek(); Log.i("tag", "3月31是星期:"+dayOfWeek); // -->3月31是星期:4</code></pre> <p>更多get方法:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/996f6df0cd2e596d8974f6cafbbbabeb.png"></p> <p>获取日期属性</p> <ul> <li> <p>使用Property获取日期属性</p> <p>Property是DateTime中的属性,使用Property可以做一些get方法无法进行的操作。</p> </li> </ul> <pre> <code class="language-nginx">DateTime dateTime = new DateTime("2016-3-31"); dateTime.dayOfWeek().getAsShortText(Locale.ENGLISH); //Thu dateTime.dayOfWeek().getAsShortText(Locale.CHINA); //周四 dateTime.dayOfWeek().getAsText(Locale.KOREAN); // 목요일 (韩语:星期四) dateTime.dayOfWeek().getAsText(Locale.CHINA); //星期四 // getAsShortText:获取缩略的文本 // getAsText : 获取完整的文本</code></pre> <p>问题:如果我们将 3月31日 减少 1 个月,这个输出的结果会是什么呢?</p> <p>结果不可能是2月31日的 , 因为2月不存在31日。</p> <p>我们运行程序看看结果:</p> <pre> <code class="language-nginx">DateTime dateTime = new DateTime("2016-3-31"); Log.i("tag", dateTime.toString("yyyy-MM-dd hh:mm:ss")); DateTime dateTime1 = dateTime.minusMonths(1); Log.i("tag", dateTime1.toString("yyyy-MM-dd hh:mm:ss"));</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/0b910d7cb46627f0c199f6fb4713ab49.png"></p> <p>输出结果</p> <p>从图中可以看出DateTime 对这种情况是做了很好处理。</p> <p> </p> <p> </p>