2012-04-24 4 views
2

私は自分のカスタムDMY(日付、月、年)オブジェクトをDateに変換する以下のメソッドを持っています。 serverCreateDateFromDMY()メソッドにjava.util.CalendarとtimeZonesの問題

public static Date serverCreateDateFromDMY(DMY pDMY, TimeZone pTimeZone) 
    { 
     Calendar vCalendar = Calendar.getInstance(pTimeZone); 
     vCalendar.set(Calendar.YEAR, pDMY.getYear()); 
      // Below line is because DMY month counts are 1-indexed 
      // and Date month counts are 0-indexed 
     vCalendar.set(Calendar.MONTH, pDMY.getMonthOfYear() - 1); 
     vCalendar.set(Calendar.DAY_OF_MONTH, pDMY.getDayOfMonth()); 
     System.out.println(vCalendar.getTime()); 
     TimeUtilsServer.zeroCalendarHoursAndBelow(vCalendar); 
     System.out.println(vCalendar.getTime()); 
     return vCalendar.getTime(); 
    } 


public static void zeroCalendarHoursAndBelow(Calendar pToZero) 
    { 
     pToZero.set(Calendar.HOUR_OF_DAY, 0); 
     pToZero.set(Calendar.MINUTE, 0); 
     pToZero.set(Calendar.SECOND, 0); 
     pToZero.set(Calendar.MILLISECOND, 0); 
    } 

、私はこれらの引数を渡しています:= 20120424 DMYを、タイムゾーンは次のとおりです。アメリカ/ニューヨーク。アプリケーションはISTのタイムゾーンでローカルに実行されています。

上記の入力に基づいて、次の出力が出力されます。

Tue Apr 24 14:43:07 IST 2012 

Tue Apr 24 09:30:00 IST 2012 

最後に、出力時間がゼロになっていないことがわかります。どのような提案をお願いしますか?

@Marko、はい私はDateFormatについて知りました。私は次の例を試しました。まだ日付は時間とともに印刷され、ゼロではありません。

TimeZone tz = TimeZone.getTimeZone("America/New_York"); 
     Calendar vCalendar = Calendar.getInstance(tz); 
     vCalendar.set(Calendar.YEAR, 2012); 

     vCalendar.set(Calendar.MONTH, 4 - 1); 
     vCalendar.set(Calendar.DAY_OF_MONTH, 24); 
     DateFormat df = DateFormat.getDateTimeInstance(); 
     df.setTimeZone(tz); 
     System.out.println(df.format(vCalendar.getTime())); 

     vCalendar.set(Calendar.HOUR_OF_DAY,  vCalendar.getActualMinimum(Calendar.HOUR_OF_DAY)); 
     vCalendar.set(Calendar.MINUTE, vCalendar.getActualMinimum(Calendar.MINUTE)); 
     vCalendar.set(Calendar.SECOND, vCalendar.getActualMinimum(Calendar.SECOND)); 
     vCalendar.set(Calendar.MILLISECOND, vCalendar.getActualMinimum(Calendar.MILLISECOND)); 
     System.out.println(df.format(vCalendar.getTime())); 
+0

TimeUtilsServerはどのように実装されていますか? – kyiu

答えて

1

...あなたはNY時間の9時30分前です。あなたはNY時間の深夜に時間を設定し、あなたのゾーンで時間としてそれを読んでいます。 getTimeは、Dateを返します。これはタイムゾーンで設定できません。結果を印刷する時間帯を指定する場合は、DateFormatが必要です。

+0

ありがとうMarko。はい、私はそれについて知るようになります。 DateFormatを使用して簡単な例を示しましたが、まだ日付がゼロで印刷されません。私はコメントの下で文字の制限があるので、私はここで例を投稿することはできません。 – pdhinoja

+0

進歩する最善の方法は、あなたの新しい仕事、コード、そして新しい不正行為を反映するためにあなたの質問を更新することです。コンテキストの場合は、** UPDATE **を使用して下部に追加してタイトルを付けることができます。 –

+0

はい質問を更新し、私が行った小さな例を追加しました。 2012年4月24日6:13:13 AM 2012年4月24日12:00:00 AM – pdhinoja

2

java date/time APIの作成時から不適切な設計があります。たぶんあなたはJDK APIの欠点を隠すライブラリを見てみるべきです - http://joda-time.sourceforge.net/

+1

こんにちはBax。仰るとおりです。実際に私たちは製品を再設計しており、この不器用なJava Date/Time APIをjoda時間に置き換えています。 – pdhinoja

2

内部的には、DateオブジェクトとCalendarオブジェクトはUTCで格納されます。フィールドを0に設定すると、カレンダーはUTCで更新されます。

時刻を入力すると、日付が目的のタイムゾーンに変換されます。

+0

日付は常にUTCであり、決してシステムタイムゾーンではありません。 – Torben

+0

おっと、そうです:)私は私の答えを編集します! – verhage

+0

日付は実際には絶対的な瞬間であり、その瞬間を彼らがどのように見えるかを表すのは他のクラスの仕事です。カレンダーがUTCで更新されるのは事実ではありません。あなたが作成したTimeZoneとの相対的なものです。 TimeZoneを使用しなかった場合は、システムのデフォルトのTimeZoneです。とにかく、それは非常に複雑です。 –

関連する問題