Pobieranie uniksowego znacznika czasu z Date ()

85

Potrafię przekonwertować znacznik czasu unixa na Date()obiekt, umieszczając longwartość w Date()konstruktorze. Na przykład: mógłbym mieć to jako new Date(1318762128031).

Ale potem, jak mogę odzyskać uniksowy znacznik czasu z Date()obiektu?

Carven
źródło
nadal możesz uzyskać długą wartość obiektu Date, prawda?
Kent
@xEnOn: nie konwertujesz uniksowego znacznika czasu na datę przy użyciu długiego konstruktora. Uniksowy znacznik czasu, jak skomentowałem odpowiedź jackrabbit, jest wyrażany w sekundach, a nie milisekundach. Tutaj: en.wikipedia.org/wiki/Unix_time i tutaj: unixtimestamp.com/index.php Seconds. Nie milisekundy.
TacticalCoder
możliwy duplikat Getting „unixtime” w Javie
Eran Medan

Odpowiedzi:

93

getTime()pobiera milisekundy od 1 stycznia 1970 GMT przekazanego konstruktorowi. Uzyskanie z tego czasu uniksowego (tego samego, ale w sekundach) nie powinno być zbyt trudne .

zając
źródło
1
Dzięki. Pamiętałem to błędnie jako funkcję statyczną Date.getTime (new Date ()), która nie działała i myślała, co się dzieje.
Carven
47
@jackrabbit: faktycznie getTime () nie zwraca uniksowego znacznika czasu, ale „Unix timestamp * 1000”. Uzgodniona definicja znacznika czasowego Uniksa jest taka, że ​​podaje on czasy od epoki w sekundach, a nie w milisekundach; )
TacticalCoder
3
@TacticalCoder jackrabbit jest dokładniejszy: zwraca unix-timestamp w milisekundach. Tak, unix-timestamp jest ustalany w sekundach - ale jeśli twoja odpowiedź byłaby prawdziwa, ( getTime() = unixTimestamp * 1000), getTime()zawsze zwróciłoby trzy Zera na końcu, ale w rzeczywistości może zwrócić wszystko od zakończenia 000do 999, co oznacza, że ​​ma wyższą precyzja wynikająca z milisekund, a nie tylko „* 1000”. Znaczenie: porównanie prawdziwego unixTimestamp * 1000 z getTime()wynikiem mogłoby się powieść tylko w ~ 0,1% przypadków.
dognose
Dla przypomnienia, funkcja zwraca milisekundy w obszarze GMT-0 (w Greenwich), więc możesz być bezpieczny przy konwersji tego na inne obszary.
Onat Korucu
50

Aby otrzymać timestampod Date(), musisz podzielić getTime()przez 1000, tj .:

Date currentDate = new Date();
currentDate.getTime() / 1000;
// 1397132691

lub po prostu:

long unixTime = System.currentTimeMillis() / 1000L;
Pedro Lobito
źródło
1
Lub bardziej zwięźle:new Date().getTime()
MarkHu
25
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.TimeZone;

public class Timeconversion {
    private DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmm", Locale.ENGLISH); //Specify your locale

    public long timeConversion(String time) {
        long unixTime = 0;
        dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+5:30")); //Specify your timezone
        try {
            unixTime = dateFormat.parse(time).getTime();
            unixTime = unixTime / 1000;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return unixTime;
    }
}
bhasker
źródło
6

W java 8 wygodnie jest użyć nowej biblioteki dat i getEpochSecondmetody pobierania znacznika czasu (jest w sekundach)

Instant.now().getEpochSecond();

samochód wodny
źródło
Ale przedstawiony kod zwraca liczbę sekund dla tej chwili
Milan Velebit
To prawda, @MilanVelebit. Będziesz musiał zastąpić żądany Instantzamiast Instant.now(). Lub yourDesiredJavaUtilDate.toInstant()jeśli masz staromodny Dateinterfejs ze starszego interfejsu API.
Ole VV
0

Nie wiem, czy chcesz to osiągnąć w js czy java, w js najprostszy sposób na uzyskanie znacznika czasu uniksowego (jest to czas w sekundach od 01.01.1970) wygląda następująco:

var myDate = new Date();
console.log(+myDate); // +myDateObject give you the unix from that date
elverde
źródło
-1

Użyj SimpleDateFormatklasy. Spójrz na jego javadoc: wyjaśnia, jak używać przełączników formatu.

AlexR
źródło