2015-09-07 40 views
8

Zrobiłem ten fragment pokazać mój problem:Odzyskaj dwie równe dat z SimpleDateFormat w java

import java.text.SimpleDateFormat; 

public class Foo { 
    public static void main(String[] args) { 

     SimpleDateFormat formatter = new SimpleDateFormat("mm hh dd MM yyyy"); 
     String date1 = "1412293500"; 
     String date2 = "1412336700"; 
     String dateString1 = formatter.format(Long.parseLong(date1 + "000")); 
     String dateString2 = formatter.format(Long.parseLong(date2 + "000")); 
     System.out.println(dateString1 + " " + dateString2); 

    } 
} 

date1 i date2 są wyrażone w sekundach, więc spodziewam się dwie różne daty produkcji, ale terminy są wydrukowano to samo. Sprawdziłem w tym Internecie tool, a jak widać daty odnoszą się do dwóch różnych dni.

Jak mogę to rozwiązać?

+0

Pierwszy, który kompiluje kod pocztowy. – hd1

+0

Po pierwsze, twój kod jest nieprawidłowy, ponieważ zapisałeś dat2 w deklaracji var. Tak czy inaczej to prawda, że ​​moje jwm drukuje date1: 45 01 03 10 2014 date2: 45 01 03 10 2014 prawdopodobnie to zaokrągla przy pewnej wartości –

Odpowiedz

8

Różnica między tymi dwoma znacznikami czasu wynosi dokładnie 12 godzin.

Identyfikator h w formatuje godziny w godzinach przedpołudniowych (1-12), więc w rzeczywistości nie wyprowadza się rzeczywistej różnicy: data została przesunięta z AM na PM.

Spróbuj z identyfikatorem k lub H, który formatuje godzinę dziennie jako (1-24) lub (0-23).

SimpleDateFormat formatter = new SimpleDateFormat("mm kk dd MM yyyy"); 
String date1 = "1412293500"; 
String date2 = "1412336700"; 
String dateString1 = formatter.format(Long.parseLong(date1 + "000")); 
String dateString2 = formatter.format(Long.parseLong(date2 + "000")); 
System.out.println(dateString1 + " " + dateString2); // prints 45 01 03 10 2014 45 13 03 10 2014 

Można też wyjście znacznik AM/PM z identyfikatorem a jak ten:

SimpleDateFormat formatter = new SimpleDateFormat("mm hh dd MM yyyy aa"); 
String date1 = "1412293500"; 
String date2 = "1412336700"; 
String dateString1 = formatter.format(Long.parseLong(date1 + "000")); 
String dateString2 = formatter.format(Long.parseLong(date2 + "000")); 
System.out.println(dateString1 + " " + dateString2); // prints 45 01 03 10 2014 AM 45 01 03 10 2014 PM 
+1

'k' jest trochę ezoteryczne. Zwykle robi się to za pomocą 'H'. – RealSkeptic

+0

Dla formatu (kk) (1-24) to nie działa. – OiRc

4

Dzieje się tak, ponieważ daty są 12 godzin i używasz małych liter "h" do formatowania godzin. Daty są odpowiednio 1 rano i 1 po południu. Aby zobaczyć to w swoim wyjściu, należy użyć litery "H" lub dodać "a" do formatu znacznika "am/pm".