我希望能够创建各种日历,其中每一天都由时间段组成。在Java中表示此设置的最佳方法是什么?我正在解析信息,我将其作为 10:00 和一个int 3 ,其中int表示事件将花费的小时数。
我希望能够轻松添加事件,它们永远不会被删除,但它们通常会被查找。
我看了一下Java.text.DateFormat,希望它可以满足我的需求,但它似乎主要用于打印输出。
答案 0 :(得分:4)
使用Joda-Time(或等待实现后继者的Java 8)。 这个lib包含强大的解析选项和方便的操作选项。如果你收到一个带有活动所需时间的int,你可以使用它来获得结束时间。
int hours = (parsed from input);
DateTimeFormatter dtf = DateTimeFormat.forPattern("HH:mm");
LocalTime startTime = dtf.parseLocalTime(stringWithTimeFromUser);
LocalTime endTime = startTime.plusHours(hours);
如果您需要将其转换为日期时间,您也可以组合这些类。即如果您有日期时间并且只想更改用户提供的时间,您可以:
DateTime dateTime = getItFromSomewhere();
DateTime dateTimeWithNewTime = dateTime.withFields(localTime);
通常你会从用户那里得到日期;)
图书馆有广泛的文件,看那里。
答案 1 :(得分:2)
使用Joda-Time来表示实际时间。然后我将使用PrimeFaces Schedule组件(http://www.primefaces.org/showcase/ui/scheduleHome.jsf)进行显示。
这意味着学习JSF& JPA图书馆。
答案 2 :(得分:2)
避免捆绑的java.util.Date,java.util.Calendar和java.text.DateFormat / SimpleDateFormat类。他们是出了名的麻烦。
是的,Joda-Time 2.3有适合您需求的课程。
DateTime代表片刻。查看与时间跨度相关的Period
,Duration
和Interval
类。
DateTime
表示时区和时区。与似乎具有时区但实际上没有的java.util.Date不同,DateTime确实具有分配的时区。几乎总是最好指定时区,否则您将获得JVM的默认时区。
ISO 8601标准定义了一种表示时间跨度的文本方式,称为Duration。使用以下格式:PnYnMnDTnHnMnS
。为了更灵活,你可以存储PT3H
,其中“P”表示Period,“T”表示时间部分,“3H”表示3小时。在Joda-Time中,Period
类将该字符串作为构造函数并在调用toString
时输出它。因此,执行日历的一种方法是存储DateTime(开始)和ISO字符串“Duration”。
Period period = new Period( "PT3H" );
另一种常见方法是以毫秒为单位存储持续时间。这基本上就是Joda-Time中的Duration
字段,包含了毫秒数。
在Joda-Time中的Interval
表示具有特定DateTime开始和DateTime结束的跨度。您可能不想存储它,但实例化此类对象可能还有其他用途。这个类提供了方便的方法,如“重叠”和containsNow
。如果“containsNow”返回true,则表示现在正在发生相关事件。
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime startDateTime = new DateTime( 2014, 1, 23, 14, 0, 0, timeZone );
Interval interval = new Interval( startDateTime, period );
转储到控制台...
System.out.println( "interval: " + interval );
跑步时......
interval: 2014-01-23T14:00:00.000+01:00/2014-01-23T17:00:00.000+01:00
Java 8带来java.time.* package定义的新JSR 310个类。这些课程的灵感来自Joda-Time,但完全是重新设计的。
您可以立即使用Joda-Time并继续使用Java 8,因为该项目将继续得到积极维护。稍后您将学习转换到java.time包。