【问题标题】:The method getTime() is undefined for the type Object — what’s wrong?方法 getTime() 没有为 Object 类型定义——怎么了?
【发布时间】:2018-05-19 23:50:10
【问题描述】:

我创建了一个应用程序,当您单击名为“计算差异”的按钮时,它会在两个日期之间产生差异,但我不知道这段代码有什么问题。我尝试了不同的方法,但没有任何结果。如果你能帮助我,我将不胜感激。

public class DateForm extends javax.swing.JPanel {

    String date1 = "26/02/2011";
    String time1 = "11:00 AM";
    String date2 = "27/02/2011";
    String time2 = "12:15 AM";
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm a");
    private Object dateObj1;
    private Object dateObj2;

    public DateForm() {
        initComponents();
    }      

    private void btnActionPerformed(java.awt.event.ActionEvent evt) {                                    
        try {
            Date dateObj1 = sdf.parse(date1 + " " + time1);
        } catch (ParseException ex) {
            Logger.getLogger(DateForm.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            Date dateObj2 = sdf.parse(date2 + " " + time2);        // TODO add your handling code here:
        } catch (ParseException ex) {
            Logger.getLogger(DateForm.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println(dateObj1);
        System.out.println(dateObj2);
        long diff = dateObj2.getTime() - dateObj1.getTime();
        double diffInHours = diff / ((double) 1000 * 60 * 60);
        System.out.println(diffInHours);
        System.out.println("Hours " + (int)diffInHours);
        System.out.println("Minutes " + (diffInHours - (int)diffInHours)*60 );

    } 
}

【问题讨论】:

  • 程序有什么问题?错误消息(如果是,请发布错误消息)?不需要输出?
  • 这段代码有什么问题?当构建 API 中的(更好的)功能已经提供时,您将进行手动日期/时间计算
  • 你能给我一些示例输入和输出吗?
  • 请分享示例输入和输出。
  • 仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.见Tutorial by Oracle

标签: java methods netbeans compiler-errors java.util.date


【解决方案1】:

从 2018 年开始,您确实应该使用 Java 8 中引入的日期/时间 API(如果您是 Java 7 或更低版本,则使用 ThreeTen Backport

String date1 = "26/02/2011";
String time1 = "11:00 AM";
String date2 = "27/02/2011";
String time2 = "12:15 AM";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm a");

LocalDateTime start = LocalDateTime.parse(date1 + " " + time1, formatter);
LocalDateTime end = LocalDateTime.parse(date2 + " " + time2, formatter);

Duration duration = Duration.between(start, end);

long hours = duration.toHours();
long mins = duration.minusHours(hours).toMinutes();
// Or if you're using Java 9+
//long mins = duration.toMinutesPart();
System.out.println("Hours = " + hours);
System.out.println("Mins = " + mins);

哪个输出

Hours = 13
Mins = 15

我建议阅读Date and Time Classes

“请问这段代码有什么问题?”

以下...

try {
    Date dateObj1 = sdf.parse(date1 + " " + time1);
} catch (ParseException ex) {
    Logger.getLogger(DateForm.class.getName()).log(Level.SEVERE, null, ex);
}
try {
    Date dateObj2 = sdf.parse(date2 + " " + time2);        // TODO add your handling code here:
} catch (ParseException ex) {
    Logger.getLogger(DateForm.class.getName()).log(Level.SEVERE, null, ex);
}

只是创建两个对象,其范围仅与定义它们的 try-catch 块相关,dateObj1dateObj2 不能在这些块之外访问......但是......

你定义...

private Object dateObj1;
private Object dateObj2;

作为实例字段,这意味着...

System.out.println(dateObj1);
System.out.println(dateObj2);

很可能会打印null 和...

long diff = dateObj2.getTime() - dateObj1.getTime();

不会编译,因为 dateObj1dateObj2 只是定义为 ObjectObject 没有 getTime 方法

日期/时间计算很复杂,受许多不同规则的约束(因您使用的日历类型而更加复杂)

只是做...

double diffInHours = diff / ((double) 1000 * 60 * 60);

充其量是幼稚,最坏的是破碎

还有……

System.out.println("Minutes " + (diffInHours - (int)diffInHours)*60 );

好吧,没意义,(something - something) * 60 是什么?

【讨论】:

    【解决方案2】:

    MadProgrammer’s answer 是一个非常好的。我想提供一个细节:根据口味,您可以单独解析日期和时间字符串,并在解析后将它们组合起来:

        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");
        DateTimeFormatter timeFormatter 
                = DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH);
    
        String date1 = "26/02/2011";
        String time1 = "11:00 AM";
        LocalDateTime start = LocalDate.parse(date1, dateFormatter)
                .atTime(LocalTime.parse(time1, timeFormatter));
        System.out.println(start);
    

    输出是:

    2011-02-26T11:00

    一个潜在的优势是,如果其中一个已解析字符串出现错误,您将获得更准确的错误消息。

    现在还有一个细节:指定语言环境。 AM 和 PM 在其他语言中被称为其他事物,因此要确保您的代码在其他计算机上以及在您使用区域设置的那天也能正常工作……

    【讨论】:

      猜你喜欢
      • 2021-08-29
      • 2021-09-02
      • 2022-11-21
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2020-12-14
      • 2021-07-19
      相关资源
      最近更新 更多