Znacznik czasu Java - Jak utworzyć znacznik czasu z datą 23/09/2007?

Jak mogę utworzyć znacznik czasu z datą 23/09/2007?

Author: Glen, 2009-06-10

8 answers

Przez Timestamp, zakładam, że masz na myśli java.sql.Timestamp. Zauważ, że ta klasa ma konstruktor, który akceptuje argument long. Możesz to przeanalizować używając klasy DateFormat:

DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
 134
Author: Adam Paynter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-10 11:19:54

A co z tym?

java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
 99
Author: pigouina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-24 10:27:58

Jak to znacznik czasu? Jeśli masz na myśli milisekundy od epoki Uniksa:

GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();

Jeśli chcesz mieć prawdziwą Javę.sql.Obiekt Timestamp:

Timestamp ts = new Timestamp(millis);
 16
Author: Matthew Flaschen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-10 13:54:02

Tl;dr

java.sql.Timestamp.from (
    LocalDate.of ( 2007 , 9 , 23 )
             .asStartOfDay( ZoneId.of ( "America/Montreal" ) )
             .toInstant()
)

Java.CZAS

Zaktualizujmy tę stronę wyświetlając kod za pomocą java.time framework wbudowany w Javę 8 i późniejsze.

Te nowe klasy są inspirowane Joda-Time , zdefiniowanym przez JSR 310 i rozszerzonym przez threeten-Extra . Zastępują one notorycznie kłopotliwe stare klasy date-time połączone z wczesnymi wersjami Javy.

W Javie.czas, an Instant jest momentem na osi czasu w UTC. A ZonedDateTime jest momentem dostosowanym do strefy czasowej (ZoneId).

Strefa czasowa jest tutaj kluczowa. Data September 23, 2007 nie może być przetłumaczona na moment na osi czasu bez zastosowania strefy czasowej. Weźmy pod uwagę, że nowy dzień świta wcześniej w Paryżu niż w Montréal, gdzie jest jeszcze "wczoraj".

Również java.sql.Znacznik czasu reprezentuje zarówno datę, jak i godzinę dnia. Więc musimy wprowadzić godzinę dnia, aby dopasować się do daty. Zakładamy, że chcesz, aby pierwsza chwila dnia była porą dnia. Zauważ, że nie zawsze jest to czas 00:00:00.0 z powodu czasu letniego i ewentualnie innych anomalii.

Zauważ, że w przeciwieństwie do starej Javy.util.Klasa Date, a w przeciwieństwie do Joda-Time, java.typy czasu mają rozdzielczość nanosekund, a nie milisekund. Jest to zgodne z rozdzielczością Javy.sql.Znacznik czasu.

Zauważ, że java.sql.Znacznik czasu ma paskudny zwyczaj domyślnego stosowania bieżącej domyślnej strefy czasowej JVM do wartości daty i czasu podczas generowania ciągu znaków reprezentacja za pomocą metody toString. Tutaj widzisz moją America/Los_Angeles strefę czasową zastosowaną. Natomiast java.klasy czasu są bardziej rozsądne, używając standardowych formatów ISO 8601 .

LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.asStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ;

Zrzut do konsoli.

System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );

Kiedy biegniesz.

D: 2007-09-23 = zdt: 2007-09-23t00:00-04:00[Ameryka/Montreal] = instant: 2007-09-23t04:00:00Z = ts: 2007-09-22 21:00:00.0

Przy okazji, od JDBC 4.2, można używać Javy.typy czasu bezpośrednio. Nie ma potrzeby java.sql.Timestamp.

  • PreparedStatement.setObject
  • ResultSet.getObject
 7
Author: Basil Bourque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-21 16:50:57

Zgodnie z API konstruktor, który akceptowałby rok, miesiąc itd., jest przestarzały. Zamiast tego powinieneś użyć konstruktora, który akceptuje long. Możesz użyć implementacji Calendar do skonstruowania żądanej daty i uzyskania dostępu do reprezentacji czasu jako długości, na przykład za pomocą metody getTimeInMillis .

 4
Author: Philipp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-10 11:31:39

Możesz również wykonać następujące czynności:

// untested
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 23);// I might have the wrong Calendar constant...
cal.set(Calendar.MONTH, 8);// -1 as month is zero-based
cal.set(Calendar.YEAR, 2009);
Timestamp tstamp = new Timestamp(cal.getTimeInMillis());
 4
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-10 14:02:02

Dla kompletności, również rozwiązanie z Joda-Time Wersja 2.5 i jego DateTime klasa:

new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
 1
Author: user152468,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-13 07:59:02

Bardziej ogólną odpowiedzią byłoby zaimportowanie java.util.Date, wtedy gdy musisz ustawić timestamp równą bieżącej dacie, po prostu ustaw ją równą new Date().

 -1
Author: CSquid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-28 02:31:06