2016-08-22 5 views
1

Hi ich arbeite derzeit an der Erstellung von Desktop-Anwendung mit Swing.I war in der Lage, IST in EST Zeit mit Date-Klasse in Java konvertieren, aber nicht in der Lage, EST zu IST Zeit und es zu konvertieren gibt dieselbe EST-Zeit wie die IST-Zeit an. Bitte finden Sie den folgenden Code.Nicht in der Lage, EST zu IST Zeit in Java zu konvertieren

Die ChangetoEST-Funktion gibt die korrekte EST-Zeit ab der IST-Zeit an. Die ChangetoIST-Funktion gibt nicht die korrekte IST-Zeit von der EST-Zeit an und zeigt die angegebene EST-Zeit als IST-Zeit an.

public String changetoEST(String date) throws ParseException 
{ 
    SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm a"); 
    String dateInString = date; 
    Date d=formatter.parse(dateInString); 
    TimeZone tzInAmerica = TimeZone.getTimeZone("America/New_York"); 
    formatter.setTimeZone(tzInAmerica); 
    String sDateInAmerica = formatter.format(d); 
    Date dateInAmerica = formatter.parse(sDateInAmerica); 
    String a=formatter.format(dateInAmerica); 
    return a; 
} 

public String changetoIST(String date) throws ParseException 
{ 
    SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm a"); 
    String dateInString = date; 
    Date d=formatter.parse(dateInString); 
    TimeZone tzInIndian = TimeZone.getTimeZone("Asia/Calcutta"); 
    formatter.setTimeZone(tzInIndian); 
    String sDateInAmerica = formatter.format(d); 
    Date dateInAmerica = formatter.parse(sDateInAmerica); 
    String a=formatter.format(dateInAmerica); 
    return a; 
} 
+0

Ist Ihre lokale Zeitzone auf Ihrem Computer auf IST eingestellt? –

+0

Ja Jason ..im im IST-Speicherort –

+0

[Jspinner mit DateEditor] (https://docs.oracle.com/javase/tutorial/uiswing/components/spinner.html), [zum Beispiel] (http: // stackoverflow. com/a/9532721/714968) – mKorbel

Antwort

1

Set formatter an die Quelle Zeitzone vor dem Parsen (dies ist der Schritt, den Sie fehlen), und stellen Sie es auf die Zielzeitzone vor dem Formatieren, sonst wird es analysiert es die lokale Zeitzone verwendet, die IST für Sie.

Auch sollten Sie einfach sDateInAmerica direkt zurückgeben können, müssen Sie nicht erneut analysieren und dann ein zweites Mal neu formatieren.

+0

Danke Jason..Ich habe meine Lösung –

2

Die Aufrufe parse werden ausgeführt, ohne dass Sie explizit eine Zeitzone festlegen, was bedeutet, dass das Parsing mit Ihrer Standard- Zeitzone erfolgt.

Legen Sie die Quellzeitzone fest, bevor Sie analysieren, analysieren, die Zeitzone auf die Zielzeitzone festlegen und das Ergebnis formatieren.

z.

public static String istToEst(String dateInput) throws ParseException { 
    return changeTimeZone(dateInput, TimeZone.getTimeZone("Asia/Calcutta"), 
            TimeZone.getTimeZone("America/New_York")); 
} 
public static String estToIst(String dateInput) throws ParseException { 
    return changeTimeZone(dateInput, TimeZone.getTimeZone("America/New_York"), 
            TimeZone.getTimeZone("Asia/Calcutta")); 
} 
private static String changeTimeZone(String dateInput, TimeZone sourceTimeZone, 
            TimeZone targetTimeZone) throws ParseException { 
    SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm a"); 
    formatter.setTimeZone(sourceTimeZone); 
    Date date = formatter.parse(dateInput); 
    formatter.setTimeZone(targetTimeZone); 
    return formatter.format(date); 
} 

-Test

String dateInput = "08/22/2016 02:21 AM"; 
System.out.println(dateInput); 
System.out.println(istToEst("08/22/2016 02:21 AM")); 
System.out.println(estToIst("08/22/2016 02:21 AM")); 

Ausgabe

08/22/2016 02:21 AM 
08/21/2016 04:51 PM 
08/22/2016 11:51 AM 
+0

Hallo Andreas ... Vielen Dank .. Es funktioniert perfekt. Die Lösung ist einfach und verständlich. –

+0

Hallo Andreas. Ich habe noch eine Frage. Warum müssen wir die Zeitzone einstellen, bevor wir das Datum analysieren? –

+0

@Vetri Woher weiß der Parser sonst, in welcher Zeitzone die Zeichenfolge sein soll? es sei denn, die Zeichenfolge enthält die Zeitzone und Sie fügen auch das tz-Muster der Formatzeichenfolge hinzu, so dass Sie nicht wissen, dass Sie irgendetwas anderes als Ihre lokale Standardzeitzone meinen. Sie müssen also angeben, in welcher Zeitzone sich die Eingabe-Zeichenkette befindet, ansonsten nimmt sie an, dass die Eingabe in Ihrem Fall immer IST ist. Ihr ursprüngliches Converttoest schien nur zu funktionieren, weil Ihre Standardzeitzone zufälligerweise zufällig war. –

1

java.time

Sie mühsam Datum Zeitklassen alten Legacy verwenden, jetzt von derverdrängteKlassen.

Wir analysieren die Eingabezeichenfolge als LocalDateTime wie es irgendwelche Informationen über offset-from-UTC oder Zeitzone fehlt (Plus Regeln für Anomalien wie DST Offset).

DateTimeFormatter f = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a"); 
LocalDateTime ldt = LocalDateTime.parse(input , f); 

eine Zeitzone ein tatsächliches Moment auf der Timeline zu erhalten Nehmen, ein ZonedDateTime Objekt.

ZoneId zNewYork = ZoneId.of("America/New_York"); 
ZonedDateTime zdtNewYork = ldt.atZone(zNewYork); 

Um den gleichen Moment durch die Linse einer anderen Zeitzone, eine andere Wand-Uhr Zeit, passen in eine andere ZoneId zu sehen. Beachten Sie, dass wir nicht durch eine andere LocalDateTime als der Zweck dieser Klasse ist es, Informationen über Offset oder Zeitzone zu vergessen. Wir wollen das Gegenteil, um die Informationen über die Zeitzone sinnvoll zwischen den Zonen einzustellen. Also während New York ist hinter UTC von vier Stunden, Indien ist voraus von UTC um fünfeinhalb Stunden. Also brauchen wir insgesamt neuneinhalb Stunden Anpassung, was eine Änderung des Datums beinhalten kann.

ZoneId zKolkata = ZoneId.of("Asia/Kolkata"); 
ZonedDateTime zdtKolkata = zdtNewYork.withZoneSameInstant(zKolkata); // Same simultaneous moments on the timeline. 

generieren String

Sie einen String in einem beliebigen Format erzeugen können Sie das Datum-Zeit-Wert darstellen wünschen.

String output = zdtKolkata.format(f); 

Generell ist es besser java.time automatisch für Sie lokalisieren zu lassen.

Locale l = Locale.CANADA_FRENCH; // Or Locale.US, Locale.ITALY, etc. 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withLocale(l); 
String output = zdtKolkata.format(f); 
Verwandte Themen