Рассчитайте оставшееся время дня в другое время - PullRequest
0 голосов
/ 11 мая 2018

Мой сервер работает в США.Клиент получает запрос из других стран, кроме США (Австралия, Сингапур или 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.

Есть ли другой способ добиться этого?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Одна проблема с вашим кодом заключается в том, что вы предполагаете, что день составляет 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, например, «Азия / Калькутта».

0 голосов
/ 11 мая 2018
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());

    }
}
...