【问题标题】:Java Calendar NextEvent method [duplicate]Java日历NextEvent方法[重复]
【发布时间】:2021-03-17 13:00:36
【问题描述】:

我必须创建一个名为nextEvent 的方法,它接收并返回一个String,它表示这种模式中的日期:“yyyy-MM-dd HH:mm:ss”。我必须在这个String 中添加一个名为nrHoursint,以修改下一个事件的日期。我的问题是我不知道如何将int 连接到string...

代码:

 class Event {
 private Date dateStart, dateEnd;
 private String name;

 public Event(String dateStart, String dateEnd, String name) {
     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     try {
         this.dateStart = format.parse(dateStart);
         this.dateEnd = format.parse(dateEnd);
     } catch (Exception e) {
         System.out.println("Not valid date format");
     }
     this.name = name;
 }
 
 public Date getDateStart() {
     return dateStart;
 }

 public Date getDateEnd() {
     return dateEnd;
 }

 public String getNume() {
     return name;
 }
 }




 class EventRecurrent extends Event {
 private int nrHours;
 private Date next;

 EventRecurrent(String dateStart, String dateEnd, String name, int nrHours) {
     super(dateStart, dateEnd, name);
     this.nrHours = nrHours;
 }

 public String nextEvent(String next) {

     // I dont know how can I add the nrHours to the String next

     return next;
 }
 }


 public class Main {
 public static void main(String[] args) {
     EventRecurrent er = new EventRecurrent("2019-03-09 22:46:00",
             "2019-03-09 23:00:00", "walk the dog", 24);
     System.out.println(er.nextEvent("2019-04-19 22:46:23"));
     // 2019-04-20 22:46:00
 }

}

在 Main 中是一个例子:如果 nextEvent 收到“2019-04-19 22:46:23”,并且 nrHours 是 24,那么它应该打印出:2019-04-20 22:46:00

java.text.* 和 java.util.* 被导入

【问题讨论】:

  • 与您在 Event 类中处理日期的方式相同。将字符串解析为 LocalDateTime,进行日期运算,并将结果格式化为字符串。
  • 就像您不要在字符串中传递小时数但明智地使用int一样,也不要在字符串中传递日期和时间,而是明智地使用LocalDateTime .
  • 我也建议你不要使用SimpleDateFormatDate。这些类设计不佳且早已过时,尤其是前者,尤其是出了名的麻烦。而是使用LocalDateTimeZonedDateTime;两者都来自java.time, the modern Java date and time API

标签: java string class date methods


【解决方案1】:

这样你可以增加小时数。

    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = formatter.parse(next);
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.HOUR, 2);
    System.out.println(calendar.getTime());

【讨论】:

  • 我推荐使用date time API
  • 我建议你不要使用DateFormatSimpleDateFormatDateCalendar。这些类设计得很糟糕,而且每一个都已经过时了,前两个尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APILocalDateTimeDateTimeFormatter
  • 问题是我必须将小时数添加到字符串而不是日期。我的方法应该接收一个字符串并返回一个字符串。
  • 在字符串中它不是 possilbe.Forst 你需要转换为日期然后添加然后再次转换为字符串并返回。
【解决方案2】:

java.time

将日期和时间作为字符串传递是一个非常糟糕的设计。使用LocalDateTimeZonedDateTime,您的任务将变得微不足道。在任何情况下,我都建议您使用现代 Java 日期和时间 API java.time 来处理所有日期和时间工作。提到的两个类是该 API 的一部分。

但是,如果您坚持使用糟糕的设计,则必须将字符串转换为上述类型之一,添加小时数并转换回来。对于转换,我们需要一个格式化程序。

protected static final DateTimeFormatter FORMATTER
        = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");

现在你的方法变成了:

public String nextEvent(String next) {
    LocalDateTime dateTime = LocalDateTime.parse(next, FORMATTER);
    dateTime = dateTime.plusHours(nrHours);
    return dateTime.format(FORMATTER);
}

链接

Oracle tutorial: Date Time 解释如何使用 java.time。

【讨论】:

  • 我知道这是一个糟糕的设计,但我必须使用它,因为一切都已经像这样给出了。我只需要添加方法。
  • 好吧,那你还能做什么呢?来吧。
猜你喜欢
  • 2011-07-08
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
相关资源
最近更新 更多