在Java8中取出newDate/Time中的时分秒
Take out the hour, min and second in new Date/Time in Java 8
我查看了 Java 8 中的新 Date/Time,发现它们比以前更容易。所以我想到了与这个新 Date/Time 相关的事情,看看我是否能做到。
我想给程序两个不同的时间,让程序看看现在几点,告诉我具体时间还剩多少小时,分钟,秒。
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 点之前,那么程序会告诉我还有多少小时,分钟,但如果时间是 17:01-17:59,时间只会说分钟,从下午 5 点到凌晨 5 点不计算在内。不会说,还有11小时25分钟..
最后一个问题,我可以把时间设为实时吗?我的意思是,我可以打印出时间,我会看到小时、分钟、性别、纳秒……但它不会更新,我需要重新启动程序才能获得新时间……我可以通过什么方式观看实时时间?所以我看到纳秒,秒数上升或下降.. ?
谢谢。
如果您使用基准时间点,LocalTime.of(05, 00)
和 LocalTime.of(17, 00)
您使用的是 今天 的时间。如果我理解正确的话,你想计算相对于 closest 点的持续时间,这意味着如果晚上过去了,你将计算相对于明天早上或相对于昨天晚上的时间,如果午夜已经过去passed,即你当前时间在早上之前。
你可以这样做:
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;
}
}
我查看了 Java 8 中的新 Date/Time,发现它们比以前更容易。所以我想到了与这个新 Date/Time 相关的事情,看看我是否能做到。
我想给程序两个不同的时间,让程序看看现在几点,告诉我具体时间还剩多少小时,分钟,秒。
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 点之前,那么程序会告诉我还有多少小时,分钟,但如果时间是 17:01-17:59,时间只会说分钟,从下午 5 点到凌晨 5 点不计算在内。不会说,还有11小时25分钟..
最后一个问题,我可以把时间设为实时吗?我的意思是,我可以打印出时间,我会看到小时、分钟、性别、纳秒……但它不会更新,我需要重新启动程序才能获得新时间……我可以通过什么方式观看实时时间?所以我看到纳秒,秒数上升或下降.. ?
谢谢。
如果您使用基准时间点,LocalTime.of(05, 00)
和 LocalTime.of(17, 00)
您使用的是 今天 的时间。如果我理解正确的话,你想计算相对于 closest 点的持续时间,这意味着如果晚上过去了,你将计算相对于明天早上或相对于昨天晚上的时间,如果午夜已经过去passed,即你当前时间在早上之前。
你可以这样做:
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;
}
}