标记为已弃用的日期方法,但建议的日历等效项不能满足我的要求

时间:2011-11-29 13:43:25

标签: java android

我正在使用我的代码中的Date对象,我正在使用的许多方法的文档说该方法已被弃用,我应该使用Calendar对象及其等效方法。要记住的最简单的示例是使用Date.getHours()Date.getMinutes()方法来使用Calendar.get(Calendar.HOUR)等。

但是,如果我正在处理两个日期,对它们进行一些数学计算然后比较它们,它们似乎是指日历上的相同实例。 Calendar的文档说使用Calendar.getInstance(),但这似乎是返回单例Calendar实例。

Date对象对我来说很好用,但是我害怕使用标记为已弃用的方法,因为这让我觉得我的代码可能会在未来的api版本中出现。

使用Date是否安全?或者有没有办法获取唯一的日历实例?

2 个答案:

答案 0 :(得分:2)

创建Date对象,然后使用Calendar.setDate(Date d)定义另一个Calendar对象。然后你可以轻松操纵这两个日期。

操纵日期的另一种方法是操纵它们的长值(以毫秒为单位)。你可以减去,添加或其他。之后,您可以从生成的long值创建Date对象,然后从Date创建Calendar。

或者,您可以使用相对容易使用的Joda Time API。

问候!

答案 1 :(得分:2)

Calendar.getInstance()不返回单例。以下测试

@Test
public void testCalendar() throws InterruptedException {
  Calendar cal1 = Calendar.getInstance();
  Thread.sleep(1000);
  Calendar cal2 = Calendar.getInstance();
  DateFormat df = new SimpleDateFormat("yyyyMMdd-hh:mm:ss.SSS");
  String s1 = df.format(cal1.getTime());
  String s2 = df.format(cal2.getTime());
  assertEquals(s1, s2);
}

生成

org.junit.ComparisonFailure: expected:<20111129-02:50:4[5].507> but was:<20111129-02:50:4[6].507>

在进行日期数学运算时,你永远不应该在基础毫秒上工作,因为那时你假设每天有24小时,每小时有3600秒。请改用Calendar方法,或切换到JodaTime。