Convertissez LocalDate en LocalDateTime ou java.SQL.Timestamp

j'utilise JodaTime 1.6.2.

j'ai un LocalDate que je dois convertir en a (Joda) LocalDateTime , ou un java.sqlTimestamp pour ormapping.

la raison en est que j'ai trouvé comment convertir entre un LocalDateTime et un java.sql.Timestamp :

LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));

donc, si je peux juste convertir entre LocalDate et LocalDateTime , alors je peux faire la conversion continue en java.sql.Timestamp . Merci pour tout des coups de coude dans la bonne direction!

86
demandé sur BalusC 2012-01-24 22:46:09

5 réponses

JodaTime

pour convertir les org.joda.time.LocalDate de JodaTime en java.sql.Timestamp , il suffit de faire

Timestamp timestamp = new Timestamp(localDate.toDateTimeAtStartOfDay().getMillis());

pour convertir les de JodaTime org.joda.time.LocalDateTime en java.sql.Timestamp , il suffit de faire

Timestamp timestamp = new Timestamp(localDateTime.toDateTime().getMillis());

JavaTime

pour convertir Java8 java.time.LocalDate à java.sql.Timestamp , il suffit de faire

Timestamp timestamp = Timestamp.valueOf(localDate.atStartOfDay());

pour convertir les java.time.LocalDateTime de Java8 en java.sql.Timestamp , il suffit de faire

Timestamp timestamp = Timestamp.valueOf(localDateTime);
198
répondu BalusC 2015-07-09 21:37:16

La meilleure façon d'utiliser Java 8 de l'API du temps:

  LocalDateTime ldt = timeStamp.toLocalDateTime();
  Timestamp ts = Timestamp.valueOf(dateTime);

pour utilisation avec JPA mis avec votre modèle ( https://weblogs.java.net/blog/montanajava/archive/2014/06/17/using-java-8-datetime-classes-jpa ):

@Converter(autoApply = true)
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
    @Override
    public Timestamp convertToDatabaseColumn(LocalDateTime ldt) {
        return Timestamp.valueOf(ldt);
    }

    @Override
    public LocalDateTime convertToEntityAttribute(Timestamp ts) {
        return ts.toLocalDateTime();
    }
}

donc maintenant c'est le temps relatif indépendant du fuseau horaire. En outre, il est facile de faire:

  LocalDate ld = ldt.toLocalDate();
  LocalTime lt = ldt.toLocalTime();

formatage:

 DateTimeFormatter DATE_TME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
 String str = ldt.format(DATE_TME_FORMATTER);
 ldt = LocalDateTime.parse(str, DATE_TME_FORMATTER);

mise à jour: postgres 9.4.1208, HSQLDB 2.4.0 etc comprendre L'API Time Java 8 sans aucune conversation!

41
répondu GKislin 2017-05-11 20:14:56

tl; dr

le projet Joda-Time est en mode maintenance, maintenant supplanté par java.temps classes.

  • il suffit d'utiliser java.time.Instant classe.
  • pas besoin de:
    • LocalDateTime
    • java.sql.Timestamp
    • cordes

Capturer l'instant présent en UTC.

Instant.now()  

pour stocker ce moment dans la base de données:

myPreparedStatement.setObject( … , Instant.now() )  // Writes an `Instant` to database.

pour récupérer ce moment à partir de la base de données:

myResultSet.getObject( … , Instant.class )  // Instantiates a `Instant`

Pour régler l'horloge murale à celle d'un fuseau horaire particulier.

instant.atZone( z )  // Instantiates a `ZonedDateTime`

LocalDateTime est la mauvaise classe

D'autres réponses sont correctes, mais elles ne font pas remarquer que LocalDateTime est la mauvaise classe pour votre but.

dans les deux java.temps et Joda-Time , un LocalDateTime manque délibérément de tout concept de fuseau horaire ou de décalage par rapport à-UTC. En tant que tel, il ne pas représenter un moment, et est pas un point sur la ligne du temps. Un LocalDateTime représente un idée grossière sur potentiel moments le long d'une gamme d'environ 26-27 heures.

utilisez un LocalDateTime lorsque la zone/Décalage est Inconnu (pas une bonne situation), ou lorsque le décalage de zone est indéterminé. Par exemple," Noël commence au premier moment du 25 décembre 2018 "serait représenté comme un LocalDateTime .

Utiliser un ZonedDateTime pour représenter un moment dans un fuseau horaire particulier. Par exemple, Noël à partir d'une zone particulière telle que Pacific/Auckland ou America/Montreal serait représentée par un objet ZonedDateTime .

pour un moment toujours en UTC, utilisez Instant .

Instant instant = Instant.now() ;  // Capture the current moment in UTC.

Appliquer un fuseau horaire. Même moment, même point sur la ligne du temps, mais vu avec une horloge murale différente.

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;  // Same moment, different wall-clock time.

donc, si je peux juste convertir entre LocalDate et LocalDateTime,

Non, mauvaise stratégie. Si vous avez une date seule valeur, et vous voulez une date-valeur du temps, vous devez spécifier une heure de la journée. Cette heure de la journée peut ne pas être valable à cette date pour une zone particulière – auquel cas la classe ZonedDateTime ajuste automatiquement l'heure de la journée au besoin.

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ;  // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;

si vous voulez que le premier moment de la journée soit votre moment de la journée, laissez java.heure déterminer que moment. Ne présumez pas que la journée commence à 00:00:00. Des Anomalies telles que L'heure avancée (HNT) signifient que la journée peut commencer à une autre heure telle que 01:00:00.

ZonedDateTime zdt = ld.atStartOfDay( z ) ;

java.sql.Timestamp est la mauvaise classe

les java.sql.Timestamp font partie des anciennes classes de datation qui sont maintenant héritées, entièrement supplantées par le java.temps classes. Cette classe a été utilisée pour représenter un moment dans UTC avec une résolution de nanosecondes . Ce but est maintenant atteint avec java.time.Instant .

JDBC 4.2 avec getObject / setObject

à partir de JDBC 4.2 et plus tard, votre pilote JDBC peut échanger directement java.objets temporels avec la base de données en appelant:

par exemple:

myPreparedStatement.setObject( … , instant ) ;

... et ...

Instant instant = myResultSet.getObject( … , Instant.class ) ;

convertie héritage moderne

si vous devez vous interfacer avec un ancien code non encore mis à jour en java.temps , convertissez en avant et en arrière en utilisant de nouvelles méthodes ajoutées aux anciennes classes.

Instant instant = myJavaSqlTimestamp.toInstant() ;  // Going from legacy class to modern class.

... et ...

java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ;  // Going from modern class to legacy class.

à Propos de de java.heure

Le de java.time framework est construit dans Java 8 et plus tard. Ces classes remplacent les anciennes classes de date legacy telles que java.util.Date , Calendar , & SimpleDateFormat .

le Joda-Time projet, maintenant dans mode de maintenance , conseille la migration vers le java.temps des classes.

pour en savoir plus, voir le Oracle Tutorial . Et rechercher le débordement de la pile pour de nombreux exemples et explications. La spécification est JSR 310 .

vous pouvez échanger java.temps objets directement avec votre base de données. Utiliser un JDBC driver conforme à JDBC 4.2 ou plus tard. Pas besoin de Chaînes, pas besoin de classes java.sql.* .

où obtenir le java.les classes de temps?

ThreeTen-Extra " le projet étend java.temps avec des cours supplémentaires. Ce projet est un terrain d'essai pour de possibles futurs ajouts à Java.temps. Vous pouvez trouver ici quelques cours utiles tels que: Interval , YearWeek , YearQuarter , et plus .

7
répondu Basil Bourque 2018-03-12 23:47:44

selon votre fuseau horaire, vous pouvez perdre quelques minutes (1650-01-01 00:00:00 devient 1649-12-31 23:52:58)

utilisez le code suivant pour éviter que

new Timestamp(localDateTime.getYear() - 1900, localDateTime.getMonthOfYear() - 1, localDateTime.getDayOfMonth(), localDateTime.getHourOfDay(), localDateTime.getMinuteOfHour(), localDateTime.getSecondOfMinute(), fractional);
5
répondu user1302021 2012-04-10 23:12:16

depuis que Joda est fané, quelqu'un pourrait vouloir convertir LocaltDate en LocalDateTime en Java 8. En Java 8 LocalDateTime il donnera un moyen de créer une instance LocalDateTime en utilisant un LocalDate et LocalTime . Vérifier ici.

public static LocalDateTime of(LocalDate date, Heure locale)

Échantillon serait,

    // just to create a sample LocalDate
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
    LocalDate ld = LocalDate.parse("20180306", dtf);

    // convert ld into a LocalDateTime
    // We need to specify the LocalTime component here as well, it can be any accepted value
    LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00

Juste pour la référence, Pour l'obtention de l'époque secondes ci-dessous peuvent être utilisés,

    ZoneId zoneId = ZoneId.systemDefault();
    long epoch = ldt.atZone(zoneId).toEpochSecond(); 

    // If you only care about UTC
    long epochUTC = ldt.toEpochSecond(ZoneOffset.UTC);
0
répondu prime 2018-03-12 09:55:46