【问题标题】:Creating a custom Date object from Calendar?从日历创建自定义日期对象?
【发布时间】:2014-12-16 10:32:30
【问题描述】:

我需要创建一个自定义 Date 对象。我得到一个 24 小时格式的用户输入,例如 hh:mm 即 17:49 小时。 我想将小时和分钟分别设置为 17 和 49,根据当前时间保留其他详细信息,例如月、年、日。例如,如果今天是 2014 年 12 月 16 日,时间是 16:00,那么我想要一个日期对象为 2014 年 12 月 16 日,时间为 17:49。我知道我可以使用已弃用的 api 来做到这一点,但是我不想使用它们。我需要 date 对象,因为我需要将它传递给 java timer,因为 java timer 不支持任何日历对象。

用户输入以字符串形式出现,我可以使用new SimpleDateFormat(HH:mm) 构造函数解析该字符串。 我尝试使用 Calendar.set api,但没有成功。

有人可以就如何进行操作给出一些指导吗?

PS。抱歉,我不能使用 Joda 时间 :)

【问题讨论】:

  • 您为什么愿意冒险创建自定义日期对象,却不愿意使用Joda-Time?使用 Joda-Time,您可以使用一行经过良好测试和陈旧的代码:Date date = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ).withTime( 17, 49, 0, 0 ).toDate();
  • @Basil Bourque.. Joda time 是我的首选。但是我没有使用它的特权。我们致力于产品开发,不鼓励使用任何第三方 API。

标签: java date timer calendar simpledateformat


【解决方案1】:

编辑

由于 getHours()getMinutes() 已被弃用并已分别替换为 Calendar.HOUR_OF_DAYCalendar.MINUTE,因此您可以使用中间日历对象或将 YEARDAY 设置为当前值。


但是有一个问题,如果你输入第二天的小时,比如 24:01,它不会移动到第二天。上一个答案,拆分字符串时是否正确溢出。


public static void main(String[] args) throws ParseException {
    final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
    final String timeInterval = "12:01";
    Date date = simpleDateFormat.parse(timeInterval);
    final Calendar calendar = Calendar.getInstance(); //calendar object with current date
    calendar.setTime(date); //set date with day january 1 1970, this is because you parsed only the time part, the date objects assumes you start from it's lowest value, try a System.out.println(date) before this to see.
    calendar.set(Calendar.YEAR, Calendar.getInstance().get(Calendar.YEAR));
    calendar.set(Calendar.DATE,Calendar.getInstance().get(Calendar.DATE));
    calendar.set(Calendar.MONTH, Calendar.getInstance().get(Calendar.MONTH))
    date = calendar.getTime();
    System.out.println(date);
}

您可以使用Calendar 设置时间,然后使用.getTime() 方法提取日期,该方法返回java.util.Date

这个想法是根据分隔符 : 将字符串分成两部分。

然后只需初始化日历并使用这些值设置小时和分钟。

public static void main(String[] args) throws ParseException {
    final String userInput = "17:49";
    final String[] timeParts=userInput.split(":");
    Calendar cal=Calendar.getInstance(); //current moment calendar
    cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeParts[0]));
    cal.set(Calendar.MINUTE, Integer.parseInt(timeParts[1]));
    cal.set(Calendar.SECOND,0); //if you don't care about seconds
    final Date myDate=cal.getTime(); //assign the date object you need from calendar
    //use myDate object anyway you want ...
    System.out.println(myDate);
}

【讨论】:

  • @MihalC 感谢您的回答。我已经按照您上面的建议实现了这一点。但是我希望使用可用的日历或日期 api 来实现这一点。如果我没有得到更好的答案,我将继续当前的实施。再次感谢!
  • @bluelurker 我不太明白您所说的可用日历或日期 api 是什么意思。此答案使用 jdk 附带的内置 Calendar 和 Date 类。没有使用外部库。
  • @MihalC 之前应该点击过我。这似乎是一个很好的答案。非常感谢。
  • @bluelurker 您也可以删除 tmp 日历,只需使用一个,我将编辑答案。但请注意这个答案可能产生的溢出小时错误(我在回答中写道)。使用拆分字符串版本时,溢出是正确完成的
  • @MilhalC 我已经为 hh:mm 添加了一个验证,所以这不会是一个问题。
【解决方案2】:

以下代码运行良好,但我不想使用任何已弃用的 api。

...
...
String timeInterval = "18:01";
Date date = simpleDateFormat.parse(timeInterval);
Calendar calendar = Calendar.getInstance();

calendar.set(Calendar.HOUR_OF_DAY, date.getHours());
calendar.set(Calendar.MINUTE, date.getMinutes());
date = calendar.getTime();

System.out.println(date);
...
...

【讨论】:

  • 我用一个可能的修复方法编辑了我的答案,但感觉就像在绕圈子……也许将输入字符串一分为二是更好的选择。由你决定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 2013-05-06
  • 2012-02-06
  • 1970-01-01
  • 2019-10-25
  • 2017-01-10
相关资源
最近更新 更多