Zapisywanie znacznika czasu w tabeli mysql przy użyciu php

94

Mam pole w tabeli MySQL, które ma timestamptyp danych. Zapisuję dane w tej tabeli. Ale kiedy przekażę znacznik czasu ( 1299762201428) do rekordu, automatycznie zapisuje wartość 0000-00-00 00:00:00w tej tabeli.

Jak mogę przechowywać znacznik czasu w tabeli MySQL?

Oto moje INSERToświadczenie:

INSERT INTO table_name (id,d_id,l_id,connection,s_time,upload_items_count,download_items_count,t_time,status)
VALUES (1,5,9,'2',1299762201428,5,10,20,'1'),
       (2,5,9,'2',1299762201428,5,10,20,'1')
gautamlakum
źródło
1
O jakiej sygnaturze czasowej mówisz? Skąd to masz?
Your Common Sense
1
czy możesz wkleić tutaj strukturę swojej tabeli?

Odpowiedzi:

160

przejść w ten sposób

date('Y-m-d H:i:s','1299762201428')
jimy
źródło
7
ale wartość datetimetimestampvarchar(15)
uzyskana
2
Następnie umieść go na polu INT. W każdym razie znacznik czasu jest tylko reprezentacją daty i odwrotnie. Możesz przekonwertować datownik na datę za pomocą funkcji, o której powiedział jimy, i na odwrót za pomocą strtotime. edit: btw, timestamp obejmuje tylko zakres wszystkich możliwych dat (myślę, że od 1970-01-01 do xx-xx-2032)
Carlos Campderrós
4
więc jakie jest zastosowanie typu danych sygnatury czasowej? Pole s_time ma typ danych datownika. Nie mogę zapisać 1299762201428 w tym polu?
gautamlakum
@ lakum4stackof: Aby uzyskać szczegółowe informacje, zobacz dev.mysql.com/doc/refman/5.0/en/timestamp.html, aby uzyskać informacje o typie datownika .
RollingBoy,
1
@ lakum4stackof - użycie timestamp polega na tym, że zapisujesz znacznik czasu, ale jest on wyświetlany tylko jako data. Wewnętrznie (jak wszystkie typy danych) jest przechowywany jako liczba całkowita ze znakiem. Jeśli chcesz również sformatować ten znacznik czasu jako liczbę całkowitą, sugeruję, abyś użył wtedy pola INT. Użycie kolumny timestamp to manpipulacja daty (dodawanie interwałów i tym podobne).
Michael JV
52

Hej, użyj FROM_UNIXTIME()do tego funkcji.

Lubię to:

INSERT INTO table_name
(id,d_id,l_id,connection,s_time,upload_items_count,download_items_count,t_time,status)
VALUES
(1,5,9,'2',FROM_UNIXTIME(1299762201428),5,10,20,'1'), 
(2,5,9,'2',FROM_UNIXTIME(1299762201428),5,10,20,'1')
Richard Tuin
źródło
Dlaczego to jest lepsze niż date('Y-m-d H:i:s','1299762201428')?
Jurij
5
Bezpieczeństwo typów: FROM_UNIXTIMEzwraca natywny typ daty mysql, podczas gdy php date()zwraca ciąg.
Richard Tuin
5
Jest lepiej, ponieważ serwer WWW (PHP) i MySQL mogą znajdować się w różnych miejscach. Tak więc data („Ymd H: i: s”, „1299762201428”) ustawi strefę czasową serwera WWW. Z różnymi serwerami internetowymi umieszczonymi w różnych strefach będziesz mieć niespójne dane. Alternatywnie, w swoim kodzie musisz wymusić strefę czasową aplikacji na strefę czasową MySQL. date_timezone_set
Ostico
18
$created_date = date("Y-m-d H:i:s");
$sql = "INSERT INTO $tbl_name(created_date)VALUES('$created_date')";
$result = mysql_query($sql);
Tushar Kumar Kundan
źródło
15

Kilka rzeczy do wyjaśnienia:

  • Typ pola datownika MySQL nie przechowuje uniksowych znaczników czasu, ale raczej wartość typu datetime.
  • Znacznik czasu UNIX to liczba zwykłego typu int.
  • Znacznik czasu, o którym mówisz, nie jest zwykłym znacznikiem czasu uniksowego, ale znacznikiem czasu z milisekundami.

Dlatego poprawna odpowiedź byłaby

$timestamp = '1299762201428';
$date = date('Y-m-d H:i:s', substr($timestamp, 0, -3));
Twój zdrowy rozsądek
źródło
3

Typ danych „ bigint unsigned ” może odpowiadać temu wymaganiu.

RollingBoy
źródło
2

Domyślam się, że pole, w którym próbujesz zapisać wartość, jest polem daty i godziny . To nie jest, ale to samo wydaje się być prawdą w przypadku znaczników czasu . Jeśli tak, mysql oczekuje, że format będzie następujący: rok-miesiąc-dzień Godzina: minuta: sekunda. Aby zapisać znacznik czasu, będziesz musiał przekonwertować pole na numeryczne za pomocą zapytania takiego jak

alter table <table_name> change <field> <field> bigint unsigned

Jeśli używasz aktualnego czasu, możesz użyć now () lub current_timestamp.

Belinda
źródło
2

Możesz również użyć now()w swoim zapytaniu, tj .:

insert into table (time) values(now());

Wykorzysta aktualny znacznik czasu.

Masood Moshref
źródło
1

Posługiwać się FROM_UNIXTIME() .

Uwaga: 1299762201428 wygląda bardziej jak milisekundowy znacznik czasu (jak Date () * 1 w JavaScript) i prawdopodobnie musisz podzielić to przez 1000.

Udo G
źródło
1

Sprawdź typ pola w tabeli, po prostu zapisz wartość znacznika czasu w typie danych, takim jak bigint itp.

Nie datetimewpisz


źródło
1

To powinno wystarczyć:

  $time = new DateTime; 
misaizdaleka
źródło
0

Jeśli znacznik czasu to aktualny czas, możesz użyć NOW()funkcji mysql

ipsum
źródło
0

Użyj datetimetypu pola. Ma wiele zalet, takich jak czytelność dla człowieka (nikt nie czyta znaczników czasu) i funkcje MySQL .

Aby przekonwertować z uniksowego znacznika czasu, możesz użyć funkcji MySQL FROM_UNIXTIME(1299762201428). Aby przekonwertować z powrotem można użyć UNIX_TIMESTAMP: SELECT UNIX_TIMESTAMP(t_time) FROM table_name.

Oczywiście, jeśli nie podoba funkcji MySQL, zawsze można użyć PHP: 'INSERT INTO table_name SET t_time = ' . date('Y-m-d H:i:s', $unix_timestamp).

Znarkus
źródło
Typ timestamp pola jest również czytelny dla człowieka (podczas używania SELECTw konsoli). Są bardzo różne i obie mają swoje wady / zalety. Główna różnica polega na tym, jak obsługiwane są strefy czasowe.
Udo G
@Udo G: Masz rację, ale nadal wolę datetimez różnych powodów. Jaka jest według Ciebie największa wada / zaleta?
Znarkus,
największa zaleta timestamp: lepiej dopasowuje się do znaczników czasu PHP, ponieważ jest odporny na ustawienia strefy czasowej zarówno serwera, jak i klienta, natomiast datetimezmienia wyświetlaną wartość w zależności od strefy czasowej klienta MySQL (oczywiście zależy to od projektu, który jeden jest lepszy). największa wada timestamp: nie obsługuje wartości NULL i (nie wiem, co zrobili, kiedy to zaprogramowali) TIMESTAMP NOT NULLpole staje się TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP. W moim przypadku niestety muszę użyć TIMESTAMPze względów TZ.
Udo G
0

Lepiej jest użyć typu danych varchar(15).

gautamlakum
źródło
3
Zapisywanie liczby w postaci ciągu zwykle nie jest dobrą praktyką, ponieważ łańcuchy są wolniejsze w porównaniu i trudniejsze do wykonania obliczeń.
RollingBoy,
Mój głos trafia do unsigned int - ale przejdźmy do króliczej nory. Dlaczego varchar, a nie char? Jest to wpis o stałej długości - mikro-optymalizacja, ale nadal ...
BradChesney79,
0

Można to zrobić: $date = \gmdate(\DATE_ISO8601);.

HelpNeeder
źródło
-1

Jeśli wiem, że bazą danych jest MySQL, użyję funkcji NOW () w następujący sposób:

INSERT INTO table_name
   (id, name, created_at) 
VALUES 
   (1, 'Gordon', NOW()) 
Jannie Theunissen
źródło
To zapisze tylko aktualny znacznik czasu, a nie dokładnie to, o co prosi OP.
charliefortune