質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

2回答

3645閲覧

TimeZone.getOffsetについて

TEKETEKE75180

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/12/09 08:13

現在、java7でプログラミングを行っています。

タイトルにあるメソッドは、日付のある日からのミリ秒数を渡すと思いますが、
このミリ秒数がどんなに違ってもTimeZoneIDが同じであれば
常に同じ値を返すのでしょうか。

例えば、

TimeZone timeZone = TimeZone.getTimeZone("Asia/Tokyo")
timeZone.getOffset((new Date()).getTime())

というロジックをいつ流しても、timeZone.getOffsetは
いつも同じ値を返すのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

日本でサマータイムが実施されない限り、そうなりますね。
かつて日本でもサマータイムが導入されていたそうです(Wikipedia - 夏時間法)。
これが適用されていた1951年5月6日午前2時で同じことをすると…

java

1import java.util.Calendar; 2import java.util.TimeZone; 3 4public class Q58253 { 5 6 public static void main(String[] args) { 7 TimeZone zone = TimeZone.getDefault(); 8 Calendar cal = Calendar.getInstance(); 9 System.out.println(zone.getOffset(cal.getTimeInMillis())); 10 cal.set(1951, 4, 6, 2, 0); // 1951年5月6日午前2時 11 System.out.println(zone.getOffset(cal.getTimeInMillis())); 12 } 13}

###出力結果
32400000
36000000

投稿2016/12/09 08:26

編集2016/12/09 12:07
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TEKETEKE75180

2016/12/12 08:21

なるほど、セットされる日付によっては、結果が異なる(サマータイムの時間分ズレる?)ということですね。 お答えいただき、ありがとうございました。
swordone

2016/12/12 15:19

http://docs.oracle.com/javase/jp/8/docs/api/java/util/TimeZone.html#getOffset-long- 確かにドキュメントだとわかりにくいんですよね。 要するにこのメソッドは、世界標準時でのある時点で、このタイムゾーンの世界標準時からの時差は何ミリ秒か、ということを取得するメソッドです。 なので夏時間が施行されていない現在の日本では常に+9時間(+32400000ミリ秒)を返します。 夏時間が施行されていれば、時刻は1時間進むので、トータル+10時間(+36000000ミリ秒)を返します。
TEKETEKE75180

2016/12/14 07:41

なるほど、そういうことですね。 ご回答ありがとうございました。
guest

0

日付のある日からのミリ秒ではなく「ローカルタイムを取得するためにUTC(協定世界時)に追加するミリ秒単位の時間の量」です。

例えば、タイムゾーンをAsia/Tokyoと指定しています。Asia/Tokyoは協定世界時より9時間増やした値なので、

9(時間) * 60(分) * 60(秒) * 1000(ミリ秒) = 32,400,000

の値が得られます。

投稿2016/12/09 08:23

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TEKETEKE75180

2016/12/14 06:23 編集

>例えば、タイムゾーンをAsia/Tokyoと指定しています。Asia/Tokyoは協定世界時より9時間増やした値 ⇒ということは、返される値はタイムゾーンのみをみていて、引数の値をみていない(考慮してない)ので、TimeZone.getOffsetにどんな値を入れようが、32,400,000が返されるということでしょうか。
TEKETEKE75180

2016/12/14 07:36

TimeZone.getOffsetの中を見ましたが、引数で渡されるミリ秒は、サマータイム期間中?かどうかの判定に用いていて、実際のOffsetがいくつかという計算には用いてないみたいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問