2015-11-04 145 views
1

我有一个任务对象,有一个名称和一个日期。日期值必须是String。一个示例是11/9/2015 23:0011/24/2015 12:00进行比较。 我需要帮助,为此编写compareTo(),以便最早显示最早日期的任务。我所拥有的是不正确的,因为它没有正确比较。我知道有替代品,但它是必需的,我用String来做到这一点。我曾考虑使用.split()将mm/dd/yyyy分割为"/",但不知道如何执行此操作。比较类型的日期字符串

public class Task implements Comparable<Task> { 
    /** Task name. */ 
    private String name; 
    /** Task due date. */ 
    private String dueDate; 

    /** 
    * Initializes a tasks name and due date. 
    * @param n Name 
    * @param d due date 
    */ 
    public Task(String n, String d) { 
     name = n; 
     dueDate = d; 
    } 

    /** 
    * Accessor for task name. 
    * @return Task name. 
    */ 
    public String getName() { 
     return name; 
    } 

    /** 
    * Accessor for task due date. 
    * @return Task due date. 
    */ 
    public String getDueDate() { 
     return dueDate; 
    } 

    /** 
    * Compares the due dates of the tasks to get the soonest to the front of the list. 
    * @param t The task to compare. 
    * @return The tasks in chronological order. 
    */ 
    @Override 
    public int compareTo(Task t) { //Need help here. 
     int val = dueDate.compareTo(t.getDueDate()); 

     if(val == 0) { 
      val = name.compareTo(t.getName()); 
     } 
     if(dueDate.compareTo(t.getDueDate()) > 0) { 
      val = -1; 
     } 
     if(dueDate.compareTo(t.getDueDate()) < 0) { 
      val = 1; 
     } 
     return val; 
    } 
+0

可以转换为Date对象然后比较吗? – AbtPst

+0

[在Java中比较日期字符串](http:// stackoverflow。com/questions/10609596/comparison-date-strings-in-java) –

+0

@AbtPst不,我必须使用'String' – JCCS

回答

2

,你必须将日期作为字符串并不意味着你不能将它转换为Date和使用该类的自然排序的事实:

@Override 
public int compareTo(Task t) { 
    // Handling ParseExceptions omitted for bravity's sake 
    SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm"); 
    Date d1 = df.parse(dueDate); 
    Date d2 = df.parse(t.getDueDate()); 

    int val = d1.compareTo(d2); 

    if(val != 0) { 
     return val;  
    } 
    return name.compareTo(t.getName()); 
} 
1

日期时间对象

我建议你在课堂上使用日期时间对象而不是字符串作为成员。

Java 8及更高版本包含非常有用的java.time框架。使用这些新类(灵感来自Joda-Time),而不是那些臭名昭着的老类java.util.Date/.Calendar。

不需要解析日期时间输入字符串。 java.time框架默认分析ISO 8601格式的任何字符串。对于其他格式,请定义您期望输入的格式化程序模式,并让java.time执行此操作。

时区

不知道他们的时区不能比拟的日期时间字符串作为你的。也许这是UTC?或者你是否假设你所有的数据都是指特定的时区?

在下面的例子中,我任意假设一个时区America/Los_Angeles

示例代码。

Java 8中的此示例代码使用java.time.format包解析您的字符串以在构造函数中输入,并再次在dueDateTimeAsAmericaLosAngeles方法中生成字符串表示形式。

通常最好在UTC时区保留日期时间值。然后根据用户或其他软件预期的时区进行调整。所以我们在UTC上存储了一个Instant,在UTC的时间线上。对于特定时区,请创建一个ZonedDateTime对象。

如果违背我的建议,你坚持把日期时间值存储为一个字符串,那么你可以通过移动字符串解析到即时发生的地方来修改这段代码。

package timestuff; 

import java.time.Instant; 
import java.time.ZoneId; 
import java.time.ZonedDateTime; 
import java.time.format.DateTimeFormatter; 

public class Task implements Comparable<Task> { 

    String title; 
    Instant due; 

    public Task (String title , String dateTimeAssumedToBeAmericaLosAngles) { 
     this.title = title; 
     ZoneId zoneId = ZoneId.of ("America/Los_Angeles"); 
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("M/d/yyyy HH:mm").withZone (zoneId); // Example data: 11/24/2015 12:00 
     this.due = formatter.parse (dateTimeAssumedToBeAmericaLosAngles , Instant :: from); 
    } 

    @Override 
    public String toString() { 
     return "Task{ " + "title=" + title + " | instant=" + due + " }"; 
    } 

    @Override 
    public int compareTo (Task t) { 
     // Sort by the date-time of when this task is due. 
     int result = this.due.compareTo (t.due); 
     return result; 
    } 

    String dueDateTimeAsAmericaLosAngeles() { 
     ZoneId zoneId = ZoneId.of ("America/Los_Angeles"); 
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("M/d/yyyy HH:mm").withZone (zoneId); // Example data: 11/24/2015 12:00 
     ZonedDateTime zdt = ZonedDateTime.ofInstant (this.due , zoneId); 
     String output = zdt.format (formatter); 
     return output; 
    } 

    public static void main (String[] args) { 
     Task t1 = new Task ("x" , "11/9/2015 23:00"); 
     Task t2 = new Task ("y" , "11/24/2015 12:00"); 
     int compared = t1.compareTo (t2); 
     System.out.println ("t1: " + t1 + " & t2: " + t2 + " compared: " + compared); 
    } 

} 

当运行:

T1:任务{标题= X | instant = 2015-11-10T07:00:00Z} & t2:任务{title = y | instant = 2015-11-24T20:00:00Z}比较:-1