Метод getTime () не определен для типа Object - что не так? - PullRequest
0 голосов
/ 20 мая 2018

Я создал приложение, которое генерирует разницу между двумя датами, когда вы нажимаете кнопку с именем «Рассчитать разницу», но я не знаю, что не так с этим кодом.Я пробовал разные методы и безрезультатно.Если вы можете мне помочь, я буду благодарен, ребята.

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 );

    } 
}

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Ответ MadProgrammer очень хороший.Я просто хотел бы предоставить детали: в зависимости от вкуса вы можете разобрать строки даты и времени по отдельности и объединить их после анализа:

    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 называются другими вещами на других языках, поэтому убедитесь, что ваш код работает на других компьютерах, а также в тот день, когда вы играете с региональными настройками…

0 голосов
/ 20 мая 2018

Начиная с 2018 года, вы действительно должны использовать API даты / времени, представленные в Java 8 (или ThreeTen Backport , если вы Java 7 или ниже)

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

Я бы порекомендовал прочитать Классы даты и времени

«что не так с этим кодом, пожалуйста?»

Следующее ...

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, в которых они определены, dateObj1 и dateObj2 могутне доступны вне этих блоков ... но ...

Вы определяете ...

private Object dateObj1;
private Object dateObj2;

как поля экземпляра, что означает ...

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

скорее всего напечатает null, а ...

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

не скомпилируется, потому что dateObj1 и dateObj2 просто определены как Object, а Object - нетиметь getTime метод

Расчеты даты / времени являются сложными и регулируются множеством различных правил (дополнительно усложняемых типом календаря, который вы используете)

Просто выполняйте...

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

в лучшем случае наивен, в худшем - сломан

И ...

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

ну, бессмысленно, что за (something - something) * 60?

...