计算不同时间一天中的剩余时间



我的服务器在美国运行。客户从美国(澳大利亚、新加坡或 IST(以外的其他位置提出请求。我想为客户找到一天中的剩余时间。

如何使用Java实现这一点?

ZoneId zoneId = ZoneId.of(timeZone);
ZonedDateTime zdt = ZonedDateTime.now( zoneId );
int complitedSeconds = zdt.get(ChronoField.SECOND_OF_DAY);
int totalSeconds = 86400;//24*60*60
int remainingSecond = totalSeconds - complitedSeconds;

当我将时区指定为亚洲/加尔各答时,它工作正常。但它不适用于 IST。

还有其他方法可以实现这一目标吗?

代码的一个问题是,您假设一天是 86400 秒 - 情况并非总是如此,通常在从夏令时更改为冬令时,反之亦然。

更可靠的方法是简单地获取一个表示午夜的ZonedDateTime并计算差异。

ZoneId zoneId = ZoneId.of(timeZone);
ZonedDateTime zdt = ZonedDateTime.now(zoneId);
ZonedDateTime midnight = zdt.toLocalDate().plusDays(1).atStartOfDay(zoneId);
//alternatively:
ZonedDateTime midnight = zdt.plusDays(1).truncatedTo(ChronoUnit.DAYS);
long seconds = ChronoUnit.SECONDS.between(zdt, midnight);

关于 IST,请注意它可以代表爱尔兰/印度/以色列标准时间,因此模棱两可。最好使用 IANA 时区,例如"亚洲/加尔各答"。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.joda.time.Interval;
import org.joda.time.Period;
public class DateTimeUtils {
public static void main(String[] args) {
DateTimeUtils obj = new DateTimeUtils();
SimpleDateFormat simpleDateFormat = 
new SimpleDateFormat("dd/M/yyyy hh:mm:ss");
try {
Date date1 = simpleDateFormat.parse("10/10/2013 11:30:10");
Date date2 = simpleDateFormat.parse("13/11/2014 20:35:55");
obj.printDifference(date1, date2);  
} catch (ParseException e) {
e.printStackTrace();
}
}
public void printDifference(Date startDate, Date endDate){
Interval interval = 
new Interval(startDate.getTime(), endDate.getTime());
Period period = interval.toPeriod();
System.out.printf(
"%d years, %d months, %d days, %d hours, %d minutes, %d seconds%n", 
period.getYears(), period.getMonths(), period.getDays(),
period.getHours(), period.getMinutes(), period.getSeconds());
}
}

最新更新