我查看了Java 8中的新日期/时间,看到它们比以前更容易。所以我想到了与这个新的日期/时间有关的事情,看看我是否可以做到。
我想给程序两个不同的时间,让程序查看它的时间,并告诉我在特定时间剩下多少小时,分钟,秒。
LocalTime time = LocalTime.now();
LocalTime morning = LocalTime.of(05, 00);
LocalTime evening = LocalTime.of(17, 00);
现在有了这个,我将有2个不同的时间5AM,5PM加上现在的时间。 我现在如何取出现在时间的小时和分钟,然后比较早上,晚上,看看剩下多少小时,其中一小时呢?
我试过了:
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点之前,那么程序将告诉我剩下多少小时,分钟,但如果时间是17:01-17:59,那么时间只会说明分钟,从下午5点到凌晨5点不计算在内。它不会说,它剩下11个小时25分钟..
最后一个问题,我可以让时间实时吗?我的意思是,我可以打印出时间,我会看到小时,分钟,性别,nanosec ..但它不会更新,我需要重新启动程序以获得新的时间..它是任何方式我可以看到实时的时间?所以我看到nanosec,秒数上升或下降..?
感谢。
答案 0 :(得分:2)
如果您使用基准时间点,LocalTime.of(05, 00)
和LocalTime.of(17, 00)
您正在使用今天的时间。如果我理解正确,你想要计算相对于最近点的持续时间,这意味着如果晚上已经过去,你将计算相对于明天早晨或相对于昨天晚上如果午夜过去的时间,即当你的当前时间是在早上之前。
你可以这样做:
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;
}
如果要更新时间,则需要重新计算这些值并使用适当的显示技术来显示更新的值。例如。一个简单的基于swing的应用程序可能如下所示:
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;
}
}