10

現在のシステムの日付と時刻を他のタイムゾーンに変換するために、このコードを作成しました。エラーは発生しませんが、期待どおりに出力が得られません。特定の時間にプログラムを実行した場合のように..出力は::

インドの現在の時刻は::Fri Feb 24 16:09:23 IST 2012

::中部標準時の日付と時刻は::です。Sat Feb 25 03:39:23 IST 2012

また、 CSTタイムゾーンによる実際の時間は::です。

Friday, 24 February 4:39:16 a.m(GMT - 6:00)

したがって、時間のギャップがあります。なぜこれが起こっているのかわかりません。どんな助けでもありがたいです..コードは::です

package MyPackage;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Temp2 {


    public static void main(String[] args) {

        try {
            Calendar currentdate = Calendar.getInstance();
            String strdate = null;
            DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
            strdate = formatter.format(currentdate.getTime());
            TimeZone obj = TimeZone.getTimeZone("CST");

            formatter.setTimeZone(obj);
            //System.out.println(strdate);
            //System.out.println(formatter.parse(strdate));
            Date theResult = formatter.parse(strdate);

            System.out.println("The current time in India is  :: " +currentdate.getTime());

            System.out.println("The date and time in :: "+ obj.getDisplayName() + "is ::" + theResult);
        } catch (ParseException e) {
           e.printStackTrace();
        }
    }
}
4

11 に答える 11

21

それはウェブ上にあります。グーグルできた。とにかく、ここにあなたのためのバージョンがあります(恥知らずにここから選んで変更しました):

Calendar calendar = Calendar.getInstance();
TimeZone fromTimeZone = calendar.getTimeZone();
TimeZone toTimeZone = TimeZone.getTimeZone("CST");

calendar.setTimeZone(fromTimeZone);
calendar.add(Calendar.MILLISECOND, fromTimeZone.getRawOffset() * -1);
if (fromTimeZone.inDaylightTime(calendar.getTime())) {
    calendar.add(Calendar.MILLISECOND, calendar.getTimeZone().getDSTSavings() * -1);
}

calendar.add(Calendar.MILLISECOND, toTimeZone.getRawOffset());
if (toTimeZone.inDaylightTime(calendar.getTime())) {
    calendar.add(Calendar.MILLISECOND, toTimeZone.getDSTSavings());
}

System.out.println(calendar.getTime());
于 2012-02-24T11:04:07.453 に答える
8

あなたの間違いは、parseの代わりに呼び出すことですformat

文字列から日付を解析するために呼び出しparseますが、あなたの場合、日付があり、正しいタイムゾーンを使用してフォーマットする必要があります。

コードを次のように置き換えます

Calendar currentdate = Calendar.getInstance();
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
TimeZone obj = TimeZone.getTimeZone("CST");
formatter.setTimeZone(obj);
System.out.println("Local:: " +currentdate.getTime());
System.out.println("CST:: "+ formatter.format(currentdate.getTime()));

そして、私はあなたがあなたが期待している出力を得ることができることを願っています。

于 2012-02-24T11:00:10.627 に答える
6

SimpleDateFormat#setTimezone()答えです。ETC解析に使用するタイムゾーンを持つ1つのフォーマッタ、UTC出力文字列の生成に使用する別のフォーマッタ:

DateFormat dfNy = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ROOT);
dfNy.setTimeZone(TimeZone.getTimeZone("EST"));
DateFormat dfUtc = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ROOT);
dfUtc.setTimeZone(TimeZone.getTimeZone("UTC"));

try {
    return dfUtc.format(dfNy.parse(input));
} catch (ParseException e) {
    return null;              // invalid input
}
于 2015-10-21T14:28:39.143 に答える
4

私の日常業務でJavaで日付を処理することは、簡単な作業ではありません。コーディング日数を簡素化するJoda-Timeを使用することをお勧めします。これにより、「車輪の再発明」を行う必要がなくなります。

于 2012-02-24T11:08:03.353 に答える
3

2つのSimpleDateFormatを使用できます。1つはESTタイムゾーンで日付文字列を解析するためのもので、もう1つはUTCタイムゾーンで日付を出力するためのものです。

String format = "yyyy-MM-dd HH:mm:ss";
    SimpleDateFormat estFormatter = new SimpleDateFormat(format);
    estFormatter.setTimeZone(TimeZone.getTimeZone("EST"));
    Date date = estFormatter.parse("2015-11-01 01:00:00");

    SimpleDateFormat utcFormatter = new SimpleDateFormat(format);
    utcFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));

    System.out.println(utcFormatter.format(date));
于 2015-10-21T14:26:28.347 に答える
2

問題は、date objを印刷するときにtoStringメソッドを呼び出すと、マシンのデフォルトのタイムゾーンで印刷されることです。このコードを試して、違いを確認してください。

Calendar currentdate = Calendar.getInstance();
String strdate = null;
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ssz");
strdate = formatter.format(currentdate.getTime());
System.out.println("strdate=>" + strdate);
TimeZone obj = TimeZone.getTimeZone("CST");

formatter.setTimeZone(obj);
strdate = formatter.format(currentdate.getTime());
Date theResult = formatter.parse(strdate);

System.out.println("The current time in India is  :: " +currentdate.getTime());

System.out.println("The date and time in :: " + obj.getDisplayName() + "is ::" + theResult);
System.out.println("The date and time in :: " + obj.getDisplayName() + "is ::" + strdate);
于 2012-02-24T11:28:30.883 に答える
2

一部の国では夏はCDT、冬はCSTに従うため、「CST6CDT」を使用できます。

 public static String getDateInCST() {
             Calendar calendar = Calendar.getInstance();
             DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
             formatter.setTimeZone(TimeZone.getTimeZone( "CST6CDT"));
             String strdate = formatter.format(calendar.getTime());
             TimeZone.getAvailableIDs();
             return strdate;
     }
于 2017-03-31T07:03:57.307 に答える
1

最初のメッセージ、コード内で日付と時刻を文字列として処理しないでください。数値とブール値を文字列として処理しないのと同じように(私は願っています)。適切な日時オブジェクトを使用します。

java.time

文字列入力として日付と時刻を取得することがあります。たとえば、テキストファイル、ユーザー、または別のシステムとのデータ交換からのものである可能性があります。そのような場合、最初に適切な日時オブジェクトに解析します。2番目のメッセージ、日付と時刻の作業には、最新のJava日付と時刻のAPIであるjava.timeを使用します。

    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");

    String input = "2015-11-01 01:00:00";

    ZonedDateTime nyTime = LocalDateTime.parse(input, formatter)
            .atZone(ZoneId.of("America/New_York"));
    System.out.println("Time in New York: " + nyTime);

このスニペットからの出力は次のとおりです。

Time in New York: 2015-11-01T01:00-04:00[America/New_York]

GMTに変換するには:

    OffsetDateTime gmtTime = nyTime.toOffsetDateTime()
            .withOffsetSameInstant(ZoneOffset.UTC);
    System.out.println("GMT Time: " + gmtTime);
GMT Time: 2015-11-01T05:00Z

文字列を出力する必要がある場合は、日時フォーマッタを使用してフォーマットします。アメリカの視聴者向けのフォーマットの例を次に示します。

    DateTimeFormatter userFormatter
            = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
                    .withLocale(Locale.US);
    String formattedDateTime = gmtTime.format(userFormatter);
    System.out.println("GMT Time formatted for user: " + formattedDateTime);
GMT Time formatted for user: Nov 1, 2015, 5:00:00 AM

あなたはさらに尋ねました:

以下の2つの結果のうち、どちらを選択する必要がありますか?

どちらも有効な答えなので、あなたが尋ねることを理解しています。2015年11月1日、夏時間(DST)は午前2時に終了しました。つまり、01:59:59の後に01:00:00が2回目に来ました。したがって、2015-11-01 01:00:00入力として取得した場合、それはあいまいです。これは、東部夏時間の05:00 GMTに等しい場合もあれば、東部標準時の1時間後の06:00GMTにある場合もあります。あなたの場合、どれが正しいかを私があなたに言うことができる方法はありません。withEarlierOffsetAtOverlap()またはを使用して取得する結果を制御できますwithLaterOffsetAtOverlap()。上記で、DSTの解釈を取得しました。したがって、標準時の解釈を取得するには、次のようにします。

    nyTime = nyTime.withLaterOffsetAtOverlap();
    System.out.println("Alternate time in New York: " + nyTime);

ニューヨークの代替時間:2015-11-01T01:00-05:00 [America / New_York]

時刻はまだ01:00ですが、オフセットは-05:00の代わりになって-04:00います。これにより、異なるGMT時刻も得られます。

GMT Time: 2015-11-01T06:00Z
GMT Time formatted for user: Nov 1, 2015, 6:00:00 AM

SimpleDateFormatとその仲間を避けてください

他の答えは一般的に正しいですが、そこで使用されるクラスDateFormat、、、およびはSimpleDateFormat、設計が不十分で、古くなります。最初の2つは特に厄介です。それらすべてを避けることをお勧めします。率直に言って、最新のAPIの方がはるかに使いやすいと思います。DateCalendar

リンク

Oracleチュートリアル: java.timeの使用方法を説明する日時。

于 2020-04-05T12:25:45.317 に答える
0

下記のコードを参照してください。

     DateFormat utcConverter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     utcConverter.setTimeZone(TimeZone.getTimeZone("GMT"));
     String sampleDateTime = "2015-11-01 01:00:00";
     DateFormat nyConverter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     nyConverter.setTimeZone(TimeZone.getTimeZone("EST"));
     Calendar nyCal = Calendar.getInstance();

     nyCal.setTime(nyConverter.parse(sampleDateTime));

     System.out.println("NY TIME :" +nyConverter.format(nyCal.getTime()));

    System.out.println("GMT TIME  :" +utcConverter.format(nyCal.getTime()));
于 2015-10-21T14:50:47.990 に答える
0

2020年の回答はこちら

新しいjava.time.*機能が必要であるが、それでもいじりたい場合java.util.Date

 public static Date convertBetweenTwoTimeZone(Date date, String fromTimeZone, String toTimeZone) {
        ZoneId fromTimeZoneId = ZoneId.of(fromTimeZone);
        ZoneId toTimeZoneId = ZoneId.of(toTimeZone);

        ZonedDateTime fromZonedDateTime =
                ZonedDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).withZoneSameLocal(fromTimeZoneId);

        ZonedDateTime toZonedDateTime = fromZonedDateTime
                .withZoneSameInstant(toTimeZoneId)
                .withZoneSameLocal(ZoneId.systemDefault())
                ;

        return Date.from(toZonedDateTime.toInstant());
    }

にとってjava.sql.Timestamp

    public static Timestamp convertBetweenTwoTimeZone(Timestamp timestamp, String fromTimeZone, String toTimeZone) {

        ZoneId fromTimeZoneId = ZoneId.of(fromTimeZone);
        ZoneId toTimeZoneId = ZoneId.of(toTimeZone);

        LocalDateTime localDateTimeBeforeDST = timestamp.toLocalDateTime();

        ZonedDateTime fromZonedDateTime = ZonedDateTime.of(localDateTimeBeforeDST, fromTimeZoneId);

        ZonedDateTime toZonedDateTime = fromZonedDateTime.withZoneSameInstant(toTimeZoneId);

        return Timestamp.valueOf(toZonedDateTime.toLocalDateTime());
    }
于 2020-07-07T19:10:36.113 に答える
0

GoogleカレンダーAPIの場合

private String getFormatedDate(Date date)
    {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss+05:30");
        df.setTimeZone(TimeZone.getTimeZone("GMT+05:30"));
        return df.format(date);
    }
于 2021-07-23T16:32:50.253 に答える