Domanda

I Have a dichiarazione preparata

INSERT INTO mst(time) VALUES (?);

dove il tempo è di tipo Timestamp in un PostgreSQL database "noreferrer".
Sto inserendo un Joda Time DateTime oggetto, o forse dovrei dire che sto cercando di. Riesco a trovare alcun modo per convertire l'oggetto DateTime in una java .sql.Timestamp . Ho letto i documenti Joda-tempo e vedere alcun riferimento a questo.

Grazie.

È stato utile?

Soluzione

È possibile convertire un Joda DateTime ad una lunga (Millis fin dall'epoca) prima, e quindi creare un timestamp da questo.

DateTime dateTime = new DateTime();
Timestamp timeStamp = new Timestamp(dateTime.getMillis());

Altri suggerimenti

costruttore DateTime di JodaTime in grado di gestire questo per voi. (Non sono sicuro se fosse vero, quando la questione è stata pubblicata, ma è un buon risultato di Google così ho pensato di aggiungere una soluzione più recente.)

Ci sono alcune opzioni di API:

public DateTime(Object instant);
public DateTime(Object instant, DateTimeZone zone);

Entrambe le opzioni accettano java.sql.Timestamp perché estende java.util.Date, ma i nanosecondi verranno ignorati (pavimentati), perché DateTime e Data hanno solo millisecondo risoluzione *. Senza un fuso orario specifico questo verrà impostato a DateTimeZone.UTC.


"Risoluzione" è come vengono forniti molte cifre. "Precisione" è come precisa la rappresentazione è. Ad esempio, DateTime di MSSQL ha una risoluzione di millisecondo, ma solo ~ 1/3 di un secondo di precisione (DateTime2 ha una risoluzione variabile e una maggiore precisione).

UTC timestamp con millisecondi Risoluzione Esempio:

new DateTime(resultSet.getTimestamp(1));

Se stai usando TIMESTAMP WITH TIME ZONE nel database, allora non è possibile utilizzare java.sql.Timestamp, perché non supporta le fasce orarie. Dovrete usare ResultSet # getString e analizzare la stringa.

timestamp senza fuso orario con Second Risoluzione Esempio **:

LocalDateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
    .parseLocalDateTime(resultSet.getString(1));

UTC timestamp con Second Risoluzione Esempio **:

DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
    .parseDateTime(resultSet.getString(1));

timestamp con fuso orario (formato offset) con Second Risoluzione Esempio **:

DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z")
    .parseDateTime(resultSet.getString(1));

Bonus: DateTimeFormat # forPattern memorizza nella cache in modo statico parser dal modello in modo da non dover

.


Io generalmente consiglia di utilizzare una stringa nel modello DBO al fine di rendere esplicito e risoluzione evitare di generare oggetti intermedi. (Is 2013/11/14 09:55:25 pari a 2013/11/14 09: 55: 25.000) Io in genere cerco di distinguere tra "oggetti del modello di database" ottimizzazione per problemi di conservazione dei dati e "oggetti modello di business" Ottimizzazione per utilizzo livello di servizio con uno strato trasformazione / mappatura tra. Trovo avere DAO basate CRUD generano gli oggetti di business tende direttamente a mescolare le priorità e ottimizzare per nessuno dei due, gettando le eccezioni da luoghi inaspettati a causa di casi limite perse. Avere uno strato di trasformazione esplicita permette anche di aggiungere la convalida, se necessario, come se non si controlla l'origine dei dati. Separando le preoccupazioni rende anche più facile per testare ogni livello in modo indipendente.

* Se è necessario risolvere a risoluzione nanosecondo nel vostro modello di business si dovrà utilizzare una libreria diversa.

** formato stringa timestamp può variare tra i database, non è sicuro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top