2015-06-05 96 views
0

我在Java 8中查看了新的日期/時間,並且看到它們比以前更容易。所以我想到了這個新的日期/時間,看看我能做到這一點。用Java 8中的新日期/時間取出小時,分鐘和秒鐘

我想給程序兩個不同的時間,讓程序看看它是什麼時間,告訴我有多少小時,分鐘,秒是留給特定的時間。

LocalTime time = LocalTime.now(); 
LocalTime morning = LocalTime.of(05, 00); 
LocalTime evening = LocalTime.of(17, 00); 

現在,我將有2個不同的時間上午5點,下午5點加上現在的時間。 現在我該如何取出現在時間的小時和分鐘,並與早上,晚上進行比較,看看有多少個小時,剩餘的分鐘數是多少?

我嘗試這樣做:

long betweenMor = ChronoUnit.HOURS.between(morning, time) + ChronoUnit.MINUTES.between(morning, time); 

    long betweenEve = ChronoUnit.HOURS.between(evening, time) + ChronoUnit.MINUTES.between(evening, time); 

有了,我將有時間和分鐘時間,早晨,時間和晚上之間。 現在我該怎麼辦?對我來說,棘手的部分是,如果時間是在下午5點/17.00之前,那麼程序會告訴我剩下多少小時,分鐘,但是如果時間是17點01分至17點59分,那麼時間將只是分鐘,它不會從下午5點到上午5點計數。它不會說,它剩下11小時25分鐘。

而最後一個問題,我可以讓時間實時嗎?我的意思是,我可以打印出時間,我會看到小時,分鐘,性別,nanosec ..但它不會更新,我需要重新啓動程序,以獲得新的時間..我以任何方式可以看到時間實時?所以我看到nanosec,秒數上升或下降..?

謝謝。

+6

我真的不清楚你想達到什麼目的。如果你要顯示一些樣本輸入和預期的輸出,理想情況下是一個簡短但完整的程序,它將有助於*巨大的*量。你也應該只在每個帖子詢問*一個問題。 –

+1

實時或者總是使用'LocalTime.now()'而不是一個變量,或者對一個定時器做一些事情,比如說每100毫秒(每秒十次)。正如Jon Skeet所說,給出你期望的例子,也許表格代碼如 –

回答

2

如果使用基準時間點LocalTime.of(05, 00)LocalTime.of(17, 00)您今天使用的時間爲。如果我的理解正確,你需要計算相對於最接近的點的持續時間,這意味着如果晚上過去了,如果午夜過去了,即當你現在的時間是過去的時候,你可以計算相對於明天早上或相對於昨天晚上的時間在早上。使用下面的helper方法

LocalTime morning = LocalTime.of(05, 00); 
LocalTime evening = LocalTime.of(17, 00); 
LocalTime time = LocalTime.now(); 
Duration fromMorning = Duration.between(morning, time); 
Duration toEvening = Duration.between(evening, time); 
if(fromMorning.isNegative()) toEvening=toEvening.plusDays(1); 
else if(!toEvening.isNegative()) fromMorning=fromMorning.minusDays(1); 
System.out.println(format(fromMorning, "morning")); 
System.out.println(format(toEvening, "evening")); 

private static String format(Duration d, String event) { 
    long s=d.getSeconds(); 
    String prep=" since "; 
    if(s<0) { s=-s; prep=" to "; } 
    long h=s/3600, min=s/60; 
    s-=min*60; min-=h*60; 
    return h+" hour(s), "+min+" min, "+s+" sec"+prep+event; 
} 

如果您想更新的時候,它是你的程序重新計算的問題

你可以像下面這樣做這些值並使用適當的顯示技術來顯示更新的值。例如。一個簡單的基於的應用程序可能如下所示:

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionListener; 
import java.time.Duration; 
import java.time.LocalTime; 
import javax.swing.*; 

public class Clock { 
    public static void main(String... arg) { 
     EventQueue.invokeLater(Clock::openGUI); 
    } 
    static void openGUI() 
    { 
     try{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } 
     catch(Exception ex){}// not mandatory 
     JFrame frame=new JFrame("Clock"); 
     JLabel l1=new JLabel(), l2=new JLabel(); 
     ActionListener updater=ev->{ 
      LocalTime morning = LocalTime.of(05, 00); 
      LocalTime evening = LocalTime.of(17, 00); 
      LocalTime time = LocalTime.now(); 
      Duration fromMorning = Duration.between(morning, time); 
      Duration toEvening = Duration.between(evening, time); 
      if(fromMorning.isNegative()) toEvening=toEvening.plusDays(1); 
      else if(!toEvening.isNegative()) fromMorning=fromMorning.minusDays(1); 
      l1.setText(format(fromMorning, "morning")); 
      l2.setText(format(toEvening, "evening")); 
     }; 
     updater.actionPerformed(null); 
     frame.getContentPane().add(l1, BorderLayout.NORTH); 
     frame.getContentPane().add(l2, BorderLayout.SOUTH); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     new Timer(1000, updater).start(); 
    } 
    private static String format(Duration d, String event) { 
     long s=d.getSeconds(); 
     String prep=" since "; 
     if(s<0) { s=-s; prep=" to "; } 
     long h=s/3600, min=s/60; 
     s-=min*60; min-=h*60; 
     return h+" hour(s), "+min+" min, "+s+" sec"+prep+event; 
    } 
} 
+0

我需要說你非常棒。 這段代碼確實有效,並且正是我之前所做的。 現在我需要坐下來看看你做了什麼:) 非常感謝。 – DMT82

相關問題