Java 日历复制
Java Calendar Duplicating
我正在制作一个 Elapsed Timer,除了当计时器达到 0:59 时它会跳转到 2:00 而不是 1:00 之外,它的效果还不错。不确定它是否在 10:00 或几个小时内做同样的事情,但我不知道它为什么这样做。
public long time() {
long ends = System.nanoTime();
return ends - starts;
}
public int time(TimeUnit unit) {
return (int) unit.convert(time(), TimeUnit.NANOSECONDS);
}
public String toHoursMinutesSeconds() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Calendar now = Calendar.getInstance();
now.set(Calendar.HOUR_OF_DAY, time(TimeUnit.HOURS));
now.set(Calendar.MINUTE, time(TimeUnit.MINUTES));
now.set(Calendar.SECOND, time(TimeUnit.SECONDS));
return sdf.format(now.getTime());
}
如果您使用的是 Java 8 或更高版本,则可以利用新的 Date and Time 库。
public class EnhancedTimer {
static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("HH:mm:ss");
private final long initialTime;
public EnhancedTimer() {
initialTime = System.nanoTime();
}
public long elapsedTime() {
return System.nanoTime() - initialTime;
}
public String toString() {
return formatTime(elapsedTime());
}
public static String formatTime(long timestamp) {
return LocalTime.ofNanoOfDay(timestamp).format(DATE_FORMAT);
}
}
用法
import java.util.concurrent.TimeUnit;
public class TimerTest {
public static void main(String[] args) {
EnhancedTimer timer = new EnhancedTimer();
long sleepDelay = 5000; // Sleep every 5 seconds.
try {
while (true) {
System.out.printf("%s (%d)%n", timer, timer.elapsedTime());
Thread.sleep(sleepDelay);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
}
}
原始回复
The following is my original response, in case there are people who still do not have access to Java 8.
您需要设置从最重要到最不重要的值。
例如:天→小时→分钟→秒→等
否则这些值会复合。我写了一个很好的 Timer
是基于你的原始代码。我只是做了一些调整。 main 方法将打印经过的时间,然后休眠 5 秒。如此重复直到程序被杀死。
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.concurrent.TimeUnit;
public class Timer {
protected static final DateFormat DATE_FORMAT = new SimpleDateFormat("HH:mm:ss");
protected static final TimeUnit UNIT = TimeUnit.NANOSECONDS;
private final long initialTime;
private static final long NANOSECONDS_IN_DAY = TimeUnit.DAYS.toNanos(1);
private static final long NANOSECONDS_IN_HOUR = TimeUnit.HOURS.toNanos(1);
private static final long NANOSECONDS_IN_MINUTE = TimeUnit.MINUTES.toNanos(1);
public Timer() {
initialTime = System.nanoTime();
}
public long elapsedTime() {
return System.nanoTime() - initialTime;
}
public String toString() {
return formatTime(elapsedTime(), UNIT, DATE_FORMAT);
}
private static final int nanosecondsToHours(long nanoseconds) {
return (int) UNIT.toHours(nanoseconds % NANOSECONDS_IN_DAY);
}
private static final int nanosecondsToMinutes(long nanoseconds) {
return (int) UNIT.toMinutes(nanoseconds % NANOSECONDS_IN_HOUR);
}
private static final int nanosecondsToSeconds(long nanoseconds) {
return (int) UNIT.toSeconds(nanoseconds % NANOSECONDS_IN_MINUTE);
}
public static String formatTime(long timestamp, TimeUnit unit, DateFormat dateFormat) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, nanosecondsToHours(timestamp));
cal.set(Calendar.MINUTE, nanosecondsToMinutes(timestamp));
cal.set(Calendar.SECOND, nanosecondsToSeconds(timestamp));
return dateFormat.format(cal.getTime());
}
}
用法
import java.util.concurrent.TimeUnit;
public class TimerTest {
public static void main(String[] args) {
testTime();
timeLoop();
}
private static void testTime() {
long hours_23 = TimeUnit.HOURS.toNanos(23);
long mins_55 = TimeUnit.MINUTES.toNanos(55);
long secs_55 = TimeUnit.SECONDS.toNanos(55);
long time_23_55_55 = hours_23 + mins_55 + secs_55;
System.out.println(Timer.formatTime(time_23_55_55, Timer.UNIT, Timer.DATE_FORMAT)); // 23:55:55
}
private static void timeLoop() {
Timer timer = new Timer();
long sleepDelay = 5000; // Sleep every 5 seconds.
try {
while (true) {
System.out.printf("%s (%d)%n", timer, timer.elapsedTime());
Thread.sleep(sleepDelay);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
}
}
我正在制作一个 Elapsed Timer,除了当计时器达到 0:59 时它会跳转到 2:00 而不是 1:00 之外,它的效果还不错。不确定它是否在 10:00 或几个小时内做同样的事情,但我不知道它为什么这样做。
public long time() {
long ends = System.nanoTime();
return ends - starts;
}
public int time(TimeUnit unit) {
return (int) unit.convert(time(), TimeUnit.NANOSECONDS);
}
public String toHoursMinutesSeconds() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Calendar now = Calendar.getInstance();
now.set(Calendar.HOUR_OF_DAY, time(TimeUnit.HOURS));
now.set(Calendar.MINUTE, time(TimeUnit.MINUTES));
now.set(Calendar.SECOND, time(TimeUnit.SECONDS));
return sdf.format(now.getTime());
}
如果您使用的是 Java 8 或更高版本,则可以利用新的 Date and Time 库。
public class EnhancedTimer {
static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("HH:mm:ss");
private final long initialTime;
public EnhancedTimer() {
initialTime = System.nanoTime();
}
public long elapsedTime() {
return System.nanoTime() - initialTime;
}
public String toString() {
return formatTime(elapsedTime());
}
public static String formatTime(long timestamp) {
return LocalTime.ofNanoOfDay(timestamp).format(DATE_FORMAT);
}
}
用法
import java.util.concurrent.TimeUnit;
public class TimerTest {
public static void main(String[] args) {
EnhancedTimer timer = new EnhancedTimer();
long sleepDelay = 5000; // Sleep every 5 seconds.
try {
while (true) {
System.out.printf("%s (%d)%n", timer, timer.elapsedTime());
Thread.sleep(sleepDelay);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
}
}
原始回复
The following is my original response, in case there are people who still do not have access to Java 8.
您需要设置从最重要到最不重要的值。
例如:天→小时→分钟→秒→等
否则这些值会复合。我写了一个很好的 Timer
是基于你的原始代码。我只是做了一些调整。 main 方法将打印经过的时间,然后休眠 5 秒。如此重复直到程序被杀死。
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.concurrent.TimeUnit;
public class Timer {
protected static final DateFormat DATE_FORMAT = new SimpleDateFormat("HH:mm:ss");
protected static final TimeUnit UNIT = TimeUnit.NANOSECONDS;
private final long initialTime;
private static final long NANOSECONDS_IN_DAY = TimeUnit.DAYS.toNanos(1);
private static final long NANOSECONDS_IN_HOUR = TimeUnit.HOURS.toNanos(1);
private static final long NANOSECONDS_IN_MINUTE = TimeUnit.MINUTES.toNanos(1);
public Timer() {
initialTime = System.nanoTime();
}
public long elapsedTime() {
return System.nanoTime() - initialTime;
}
public String toString() {
return formatTime(elapsedTime(), UNIT, DATE_FORMAT);
}
private static final int nanosecondsToHours(long nanoseconds) {
return (int) UNIT.toHours(nanoseconds % NANOSECONDS_IN_DAY);
}
private static final int nanosecondsToMinutes(long nanoseconds) {
return (int) UNIT.toMinutes(nanoseconds % NANOSECONDS_IN_HOUR);
}
private static final int nanosecondsToSeconds(long nanoseconds) {
return (int) UNIT.toSeconds(nanoseconds % NANOSECONDS_IN_MINUTE);
}
public static String formatTime(long timestamp, TimeUnit unit, DateFormat dateFormat) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, nanosecondsToHours(timestamp));
cal.set(Calendar.MINUTE, nanosecondsToMinutes(timestamp));
cal.set(Calendar.SECOND, nanosecondsToSeconds(timestamp));
return dateFormat.format(cal.getTime());
}
}
用法
import java.util.concurrent.TimeUnit;
public class TimerTest {
public static void main(String[] args) {
testTime();
timeLoop();
}
private static void testTime() {
long hours_23 = TimeUnit.HOURS.toNanos(23);
long mins_55 = TimeUnit.MINUTES.toNanos(55);
long secs_55 = TimeUnit.SECONDS.toNanos(55);
long time_23_55_55 = hours_23 + mins_55 + secs_55;
System.out.println(Timer.formatTime(time_23_55_55, Timer.UNIT, Timer.DATE_FORMAT)); // 23:55:55
}
private static void timeLoop() {
Timer timer = new Timer();
long sleepDelay = 5000; // Sleep every 5 seconds.
try {
while (true) {
System.out.printf("%s (%d)%n", timer, timer.elapsedTime());
Thread.sleep(sleepDelay);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
}
}