--- Faktycznie istnieje wiele lepiej sposób, aby to zrobić, ale jeśli chcesz użyć dat, przejdź do odpowiedzi przededycyjnej Daty w rzeczywistości nie rób tego, co chcesz, co wydaje się być obliczaniem czasu poza ctual trzeba wybrać razy z kalendarza świata rzeczywistego.
Znacznie lepiej byłoby napisać własną klasę, aby uniknąć wszystkich nieprzyjemnych specjalnych czynności, które musi spełniać Daty, aby nadążyć za kalendarzem gregoriańskim. Ta specjalna obsługa obejmuje (ale nie wyłącznie) świadomość strefa czasowa, czas letni, zadeklarował „pominięty dni”, skok sekund, lata przestępne, itd
public TimeOnly {
private long timestamp;
private int millis;
private int seconds;
... etc ...
public TimeOnly(int hours, int minutes, int seconds, int millis) {
this.timestamp = millis + seconds * 1000L + minutes * 60000L + hours * 3600000L;
this.millis = millis;
this.seconds = seconds;
... etc ...
}
private TimeOnly(long timestamp) {
this.timestamp = timestamp;
this.millis = timestamp % 1000;
this.seconds = timestamp % 60000L - this.millis;
... etc ...
}
public long getTimestamp() {
return timestamp;
}
public int getMillis() {
return millis;
}
public int getSeconds() {
return seconds;
}
... etc ...
}
public TimeFormatter {
public TimeFormatter() {
}
public String format(Time time) {
StringBuilder builder = new StringBuilder();
builder.append(String.valueOf(time.getHours()));
builder.append(":");
builder.append(String.valueOf(time.getMinutes()));
builder.append(":");
builder.append(String.valueOf(time.getSeconds()));
builder.append(".");
if (time.getMillis() < 10) {
builder.append("00");
} else if (time.getMillis() < 100) {
builder.append("0");
}
builder.append(time.getMillis());
return builder.toString();
}
Takie rozwiązanie może wydawać się, że jest odkrywanie koła na nowo, ale tak naprawdę unika się używania ośmiokąta jako koła. Wygląda na to, że zachowanie daty nie jest tym, czego potrzebujesz, chociaż możliwe, że sprawisz, że praca będzie działać w ograniczonym zakresie wartości.
Jeśli chcesz się naprawdę spodobać, możesz sprawić, że powyższe narzędzie będzie porównywalne itp. Jednak odradzam. Nie udostępniaj metod aktualizacji po zakończeniu budowy, ponieważ wymuszają one pewne nieprzyjemne ponowne obliczenia i powodują, że kod jest trudniejszy do utrzymania. Zamiast tego podaj metody, które zwrócą nowe TimeOnlys w odpowiedzi na operacje, które chcesz zaimplementować.
public TimeOnly addSeconds(int value) {
int stamp = this.timestamp;
stamp += value * 60000L;
if (stamp < timestamp) {
throw new Excepton("overflow");
}
return new TimeOnly(stamp);
}
Nie wdrażaj także tego, czego nie chcesz użyć. Niewykorzystany kod wydaje się być żyzną glebą dla błędów.
Oczywiście, odpowiedź na czas dla wszystkich "czas" rzeczy, należy rozważyć użycie JodaTime, który rozróżnia wszystkie różne rodzaje pomiaru czasu. Jednak w przypadku niewielkiego problemu takiego jak to, jest to podobne do używania czołgu do zabicia mrówki.
--- pre-edit odpowiedź ---
bez pełnej specyfikacji czasu (rok, miesiąc, dzień, godzina, minuta, sekunda, milisekundach) swoją wartość czasu jako sformatowane w pierwszym etapie będzie mieć wiele pól, które nie są określone. To, co dzieje się na tych polach, to prawdopodobnie śmieci.
Następnie getTime()
działa na całym obiekcie Date
, tłumacząc zarówno poprawne pola, jak i śmiecie na wartość, w której śmieci mogą nawet modyfikować prawidłowe wartości (96 sekund = 1 minuta i 36 sekund, w zależności od pól).
Najlepszym sposobem, aby go o to, aby mieć cały swój czas „tylko” Termin zainicjowany jednego znanego dni, więc jeśli zrobisz porównań i operacji matematycznych (jest 3 11 23
>1 02 10
?) Można uzyskać spójne wyniki (tak, 3 11 23
>1 02 10
, bo to jest rzeczywiście 2013 02 10 00 03 11 23
>2013 02 10 00 03 11 23
i nie 2013 02 10 00 03 11 23
porównaniu 2000 02 10 00 03 11 23
Przy wyborze dzień w użyciu, unikać dni sąsiadujące Feb 29, dni, które są w pobliżu przesunięcia oszczędności światła dziennego itp
jest prawdopodobnie klasa SimpleTimeFormat próbuje honorować aktualne ustawienia strefy czasowej, które wymagałyby przetłumaczenia czasu na coś przed "1 stycznia 1970 00: mm: ss". Ponieważ epoka byłaby wtedy "po" czasie (i tam też jest podwójna obsada, co nie pomaga), prawdopodobnie dryfował do niewielkiego zakresu wewnętrznych wartości nieważnych, co skutkowało nieprawidłowymi wartościami zewnętrznymi. Możesz to nazwać błędem, ale ciężko jest utrzymać go w odpowiedzialności za czasy poza jego deklarowanym skutecznym zasięgiem. –
@EdwinBuck Edytowane. – Dukeling
Dziękuję bardzo Dukeling :) działa idealnie teraz ... – user2052015