Respostas:
Por Timestamp
, eu presumo que você queira dizer java.sql.Timestamp
. Você notará que esta classe possui um construtor que aceita um long
argumento. Você pode analisar isso usando a DateFormat
classe:
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
java.util.Date
, java.util.Calendar
e java.text.SimpleDateFormat
agora são legadas , suplantadas pelas classes java.time construídas no Java 8 e posterior. Veja o Tutorial da Oracle .
Que tal isso?
java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
O que você quer dizer com carimbo de data / hora? Se você quer dizer milissegundos desde a época do Unix:
GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();
Se você quiser um objeto java.sql.Timestamp real:
Timestamp ts = new Timestamp(millis);
Calendar.SEPTEMBER
java.sql.Timestamp.from (
LocalDate.of ( 2007 , 9 , 23 )
.atStartOfDay( ZoneId.of ( "America/Montreal" ) )
.toInstant()
)
Vamos atualizar esta página mostrando o código usando a estrutura java.time construída no Java 8 e posterior.
Essas novas classes são inspiradas no Joda-Time , definido pela JSR 310 e estendido pelo projeto ThreeTen-Extra . Eles suplantam as classes data-hora notoriamente problemáticas, agrupadas com as primeiras versões do Java.
Em java.time, Instant
é um momento na linha do tempo em UTC. A ZonedDateTime
é um Instant ajustado em um fuso horário ( ZoneId
).
O fuso horário é crucial aqui. Uma data de September 23, 2007
não pode ser traduzida em um momento na linha do tempo sem aplicar um fuso horário. Considere que um novo dia amanhece mais cedo em Paris do que em Montreal, onde ainda é “ontem”.
Além disso, um java.sql.Timestamp representa a data e a hora do dia. Portanto, devemos injetar uma hora do dia para acompanhar a data. Presumimos que você deseja o primeiro momento do dia como a hora do dia. Observe que esta nem sempre é a hora 00:00:00.0
devido ao horário de verão e possivelmente outras anomalias.
Observe que, ao contrário da classe java.util.Date antiga e ao contrário do Joda-Time, os tipos java.time têm uma resolução de nanossegundos em vez de milissegundos. Isso corresponde à resolução de java.sql.Timestamp.
Observe que o java.sql.Timestamp tem o péssimo hábito de aplicar implicitamente o fuso horário padrão atual da JVM ao valor de data e hora ao gerar uma representação de string por meio de seu toString
método. Aqui você vê meu America/Los_Angeles
fuso horário aplicado. Em contraste, as classes java.time são mais lógicas, usando formatos padrão ISO 8601 .
LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.atStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ;
Despeje para o console.
System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );
Quando corre.
d: 2007-09-23 = zdt: 2007-09-23T00: 00-04: 00 [America / Montreal] = instant: 2007-09-23T04: 00: 00Z = ts: 2007-09-22 21:00: 00,0
A propósito, a partir do JDBC 4.2, você pode usar os tipos java.time diretamente. Não há necessidade java.sql.Timestamp
.
PreparedStatement.setObject
ResultSet.getObject
A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como java.util.Date
, Calendar
, e SimpleDateFormat
.
O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .
Para saber mais, consulte o tutorial Oracle . E pesquise no Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
Você pode trocar objetos java.time diretamente com seu banco de dados. Use um driver JDBC compatível com JDBC 4.2 ou posterior. Não há necessidade de cordas, não há necessidade de java.sql.*
classes.
Onde obter as classes java.time?
O projeto ThreeTen-Extra estende java.time com classes adicionais. Este projeto é um campo de provas para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval
, YearWeek
, YearQuarter
, e mais .
Você também pode fazer o seguinte:
// 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());
De acordo com a API, o construtor que aceitaria ano, mês e assim por diante foi descontinuado. Em vez disso, você deve usar o Construtor que aceita um longo. Você pode usar uma implementação de Calendário para construir a data desejada e acessar a representação de tempo como um longo, por exemplo, com o método getTimeInMillis .
Para completar, também uma solução com Joda-Time versão 2.5 e sua DateTime
classe:
new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
DateTime
objeto. Isso significa que seus resultados irão variar em vários computadores ou configuração do sistema operacional host ou configurações de JVM. Para resultados previsíveis, passe um fuso horário para esse DateTime
construtor. Escolha o nome do fuso horário adequado para sua intenção. Por exemplo, DateTimeZone.forID( "America/Montreal" )
ou DateTimeZone.UTC
.
DateTime
objeto seus milissegundos desde a época. Substitua .toDate().getTime()
por .getMillis()
.
DateTimeZone.getDefault()
e passando o resultado como o argumento opcional. (A propósito, idem para a Locale.getDefault()
mesma questão sobre a ambiguidade de argumentos opcionais.)
Uma resposta mais geral seria importar java.util.Date
, então quando você precisar definir um timestamp
igual para a data atual, simplesmente defina-o como igual a new Date()
.