私がBST、つまりブリティッシュサマータイムにいて、米国/東部のタイムゾーンに従って19.30にジョブを実行したい場合、どうすればそれを達成できますか。
私が試したサンプルコード、
Instant now = Instant.now();
LocalDateTime localTimeNow = LocalDateTime.ofInstant(now, ZoneOffset.systemDefault());
//if BST then use "Europe/London"
//if US/Eastern then use "America/New_York"
// For EST also use "America/New_York"
// If GB-Eire then use "Europe/London"
ZonedDateTime bsTime = now.atZone(ZoneId.of("Europe/London"));
ZonedDateTime nyAmerica = now.atZone(ZoneId.of("America/New_York"));
// Lets calculate the difference between 2 timezones
// Between London and EST
long timeDiff = ChronoUnit.MILLIS.between(bsTime, nyAmerica);
System.out.println("timeDiff - " + timeDiff);
int minutes = (int) ((timeDiff / 1000) / 60);
System.out.println("Time diff bet London and EST - " + minutes + " minutes");
long diff = Duration.between(bsTime, nyAmerica).getSeconds();
int mins = (int) (diff / 60);
System.out.println("Time diff bet London and EST - " + mins + " minutes");
どちらの場合もゼロになります。
私が欲しいのは、この遅延を使用して、それを以下のようにexecutorサービスに渡す必要があることです。
executor.schedule(myRunnable, delay, TimeUnit.SECONDS);
したがって、私が英国にいる場合でも、ジョブはUS / Easternに従って19.30に実行される必要があります。
また、EST、BSTなどの一部の略語は有効なZoneIdではありません。では、ESTやBSTなどの省略形式のタイムゾーンがある場合、どうすればそれらのケースを処理できますか?
更新:以下の元の答えは、異なる時間帯の特定の時刻に実行する必要があるジョブを開始するための現地時間を計算する方法を示しています。
その時間まで待機する時間を計算するだけの場合は、ローカルタイムゾーンを使用しなくても、はるかに簡単に計算できます。
LocalTime jobStartTime = LocalTime.of(19, 30);
ZoneId jobZone = ZoneId.of("America/New_York");
ZonedDateTime now = ZonedDateTime.now(jobZone);
ZonedDateTime jobDateTime = now.with(jobStartTime);
if (jobDateTime.isBefore(now))
jobDateTime.plusDays(1);
long delay = ChronoUnit.MILLIS.between(now, jobDateTime);
System.out.println("now = " + now);
System.out.println("jobDateTime = " + jobDateTime);
System.out.println("delay = " + delay + " = " + Duration.ofMillis(delay));
出力
now = 2020-07-17T08:18:45.482028800-04:00[America/New_York]
jobDateTime = 2020-07-17T19:30-04:00[America/New_York]
delay = 40274517 = PT11H11M14.517S
now
は2020-07-17 07:57:45 Z
ロンドンにあり、は2020-07-17 08:57:45 +01:00
ニューヨークにあり2020-07-17 03:57:45 -04:00
ます。
ロンドンとニューヨークの時差は?彼らは同じ時間なので、
0秒。
質問のコードは、時間が19:30になる時期を計算しません。代わりに、それは計算にのようにタイムゾーンの違いを試み、今が、夏時間のため、午後7時半の時間帯の違いがあるかもしれない異なったアプローチが間違っているので、。
ロンドンにいて、ニューヨークで次の19:30になる時期を知る必要がある場合は、次のようにします。
Instant now = Instant.now();
ZoneId localZone = ZoneId.of("Europe/London");
ZoneId remoteZone = ZoneId.of("America/New_York");
System.out.println("now = " + now);
ZonedDateTime remoteNow = now.atZone(remoteZone);
LocalDate remoteDate = remoteNow.toLocalDate();
LocalTime remoteTime = LocalTime.of(19, 30);
if (remoteNow.toLocalTime().isAfter(remoteTime))
remoteDate = remoteDate.plusDays(1);
ZonedDateTime remoteStartTime = ZonedDateTime.of(remoteDate, remoteTime, remoteZone);
System.out.println("remoteNow = " + remoteNow);
System.out.println("remoteStartTime = " + remoteStartTime);
ZonedDateTime localStartTime = remoteStartTime.withZoneSameInstant(localZone);
System.out.println("localNow = " + now.atZone(localZone));
System.out.println("localStartTime = " + localStartTime);
出力
now = 2020-07-17T07:57:45.206007800Z
remoteNow = 2020-07-17T03:57:45.206007800-04:00[America/New_York]
remoteStartTime = 2020-07-17T19:30-04:00[America/New_York]
localNow = 2020-07-17T08:57:45.206007800+01:00[Europe/London]
localStartTime = 2020-07-18T00:30+01:00[Europe/London]
したがって、イギリスのタイムゾーンを実行しているコンピューターでは、次の米国東部標準時の午後7時30分は今夜の午前0時半です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加