JodaTime 基础入门

Joda-Time令时间和日期值变得易于管理、操作和理解。事实上,易于使用是Joda的主要设计目标。其他目标包括可扩展性、完整的特性集以及对多种日历系统的支持。并且Joda与JDK是百分之百可互操作的,因此您无需替换所有Java代码,只需要替换执行日期/时间计算的那部分代码。

Maven依赖

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

使用日期和时间类

以下五个日期-时间类将经常使用:

类名含义描述
Instant即时——不可变类,代表在时间线上的一个瞬时点使用一个事件的时间戳,没有日历系统或时区担心
DateTimeDateTime——不可变类,替代JDK日历作为JDK日历类的通用替代,时区信息是很重要的
LocalDateLocalDate——不可变类,代表一个地区的日期没有时间(没有时区)可以用来代表一个出生日期,是没有必要记录一天的时间信息
LocalTimeLocalTime——不可变类,代表一个地区的时间没有日期(没有时区)可以用来代表一天的某个时间,例:一个商店打开或关闭时间
LocalDateTimeLocalDateTime——不可变类,代表一个地区的日期和时间(没有时区)



每个日期-时间类提供了各种构造函数。这些包含对象的构造函数,允许你基于不同的对象构建一个实例。例如,一个DateTime可以基于以下对象构造得到:

  • Date - a JDK instant
  • Calendar - a JDK calendar
  • String - in ISO8601 format
  • Long - in milliseconds
  • Any Joda-Time date-time class

具体示例:

// Use a Date(or millisSecond)
java.util.Date juDate = new Date();
long timeInMillis = juDate.getTime();
DateTime dt = new DateTime(timeInMillis);
dt = new DateTime(juDate);

// Use a Calendar
java.util.Calendar c1 = Calendar.getInstance();
c1.set(Calendar.HOUR_OF_DAY, 0);
c1.set(Calendar.MINUTE, 0);
c1.set(Calendar.SECOND, 0);
c1.set(Calendar.MILLISECOND, 0);
dt = new DateTime(calendar);

// Use another Joda DateTime
DateTime anotherDateTime = obtainDateTimeSomehow();
dateTime = new DateTime(anotherDateTime);

// Use a String (must be formatted property)
String timeString = "2006-01-26T13:30:00-06:00";
dateTime = new DateTime(timeString);
timeString = "2006-01-26";
dateTime = new DateTime(timeString);

// 将Joda计算结果插入到JDK对象中
Calendar calendar = Calendar.getInstance();
DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0, 0);
System.out.println(dateTime.dayOfWeek()
    .toString("E MM/dd/yyyy HH:mm:ss.SSS");
calendar.setTime(dateTime.toDate());

Date date = dateTime.toDate();

从上面可以看出JDK的Date和Calendar对象,和Joda-Time的日期时间类相互转换是非常方便的。

每个日期-时间类提供了简单容易的方法来访问其字段。

// 例如,访问月份和年份,你可以使用:

DateTime dateTime = new DateTime(
    2000, //year
    1,    // month
    1,    // day
    0,    // hour (midnight is zero)
    0,    // minute
    0,    // second
    0     // milliseconds
);
int month = dt.getMonthOfYear();  // where January is 1 and December is 12
int year = dt.getYear();

所有主要的日期-时间类都是不可变的,当您通过一个 API 方法操作 Joda 类时,您必须捕捉该方法的返回值,因为您正在处理的实例不能被修改。就像 java.lang.String 创建后不能更改。然而,对于一个新创建的对象,我们提供了一些简单的方法来改变其字段值。

// 例如,设置年份或添加2个小时,你可以使用:

DateTime dt = new DateTime();
DateTime year2000 = dt.withYear(2000);
DateTime twoHoursLater = dt.plusHours(2);

除了基本的get方法,每个日期-时间类提供了属性1取每个字段的方法。这些提供丰富了Joda-Time功能。

//例如,访问一个月或一年详细信息:

DateTime dt = new DateTime();
String monthName = dt.monthOfYear().getAsText(); // 得到月份名
String frenchShortName =        
    dt.monthOfYear().getAsShortText(Locale.FRENCH); //月份的短法语名
boolean isLeapYear = dt.year().isLeap();  // 判断是否是闰年
DateTime rounded = dt.dayOfMonth().roundFloorCopy(); 

参考链接:官方指南 & Joda Time API & 透过他人的眼看世界


  1. 属性,它相当于Java对象的属性。属性是根据所表示的常见结构命名的,并且它被用于访问这个结构,用于完成计算目的。属性是实现Joda 计算威力的关键。例如:yearOfCentury,dayOfYear,monthOfYear,dayOfMonth,dayOfWeek。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值