2016-09-01 5 views
5

мне нужно найти точку во времени, когда он будет следующий будет 7:00 утра в Окленде (Новая Зеландия)JodaTime: как найти будущее время в другой часовой пояс

Я используя Joda времени 2,6

<dependency> 
     <groupId>joda-time</groupId> 
     <artifactId>joda-time</artifactId> 
     <version>2.6</version> 
    </dependency> 

при тестировании со следующими

import org.joda.time.DateTime; 
import org.joda.time.DateTimeZone; 
import org.joda.time.format.DateTimeFormat; 
import org.joda.time.format.DateTimeFormatter; 

public class FindDateTimeInFuture { 
    static DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS z Z"); 

    public static void main(String[] args) { 
     // Use UTC as application wide default 
     DateTimeZone.setDefault(DateTimeZone.UTC); 

     System.out.println("now UTC   = " + formatter.print(DateTime.now())); 

     System.out.println("now in Auckland = " + formatter.print(DateTime.now(DateTimeZone.forID("Pacific/Auckland")))); 

     System.out.println("7 AM Auckland = " + formatter.print(DateTime.now(DateTimeZone.forID("Pacific/Auckland")).withTime(7, 0, 0, 0))); 
    } 
} 

Если я бегу выше после Полночь в Окленде, это прекрасно, это

now UTC   = 2016-09-01 13:37:26.844 UTC +0000 
now in Auckland = 2016-09-02 01:37:26.910 NZST +1200 
7 AM Auckland = 2016-09-02 07:00:00.000 NZST +1200 
         ^ok, in the future 

Но, если я бегу выше перед тем Полночь в Окленде, я получаю 7 утра в прошлом ...

now UTC   = 2016-09-01 09:37:48.737 UTC +0000 
now in Auckland = 2016-09-01 21:37:48.831 NZST +1200 
7 AM Auckland = 2016-09-01 07:00:00.000 NZST +1200 
         ^ko, in the past 

Есть ли способ сказать joda-время идти вперед, когда меняет время?

ответ

2

Я думаю, что самое очевидное решение может быть правильным

DateTime nowAuckland = 
    DateTime.now(DateTimeZone.forID("Pacific/Auckland")); 
boolean addDay = nowAuckland.getHourOfDay() >= 7; 
DateTime aucklandAt700 = nowAuckland.withTime(7, 0, 0, 0); 
if (addDay) { 
    aucklandAt700 = aucklandAt700.plusDays(1); 
} 

Вы можете просто проверить, если есть уже более чем 7:00 в Окленде и если это так просто увеличиваем количество дней.

1
private DateTime getNextDateTime(DateTime now, int hour) 
{ 
    DateTime nextDateTime = now.withTime(hour, 0, 0, 0); 
    if(nextDateTime.isBefore(now)) 
    { 
     nextDateTime = nextDateTime.plusDays(1); 
    } 
    return nextDateTime; 
} 
+0

Вы должны переименовать первый параметр для 00:30 более общего назначения, поскольку метод действительно не заботится о том, является ли значение «сейчас» или каким-то другим временем. Кроме того, если * следующая * часть имени метода должна быть взята буквально, тогда условие должно быть '! isAfter() ', потому что ваш текущий код возвращает входное значение, если это точно * точно заданный' hour'. – Andreas

0
DateTime nowAuckland = DateTime.now(DateTimeZone.forID("Pacific/Auckland")); 
DateTime currentTimeNow = DateTime.now(DateTimeZone.getDefault()); 
DateTime aucklandAt700 = nowAuckland.withTime(7, 0, 0, 0); 
System.out.println(currentTimeNow); 
Duration duration = new Interval(nowAuckland, aucklandAt700).toDuration(); 
System.out.println(currentTimeNow.plusMillis((int) duration.getMillis())); 

Печать:

2016-09-01T21:07:13.444+05:30 
2016-09-02T00:30:00.047+05:30 

7 утра в Новой Зеландии будет в IST, который кажется правильным, как в гугле

*7:00 AM Friday, in Auckland, New Zealand is 
12:30 AM Friday, Indian Standard Time (IST)*