2016-12-22 1 views
1

Ich habe mich viel umgesehen. Ich bin sehr neu in Java und versuche ein Double in einen Instant zu verwandeln. Der Anwendungsfall bezieht sich auf das Google Dataflow-Java-SDK. Das Double ist ein UNIX-Zeitstempel aus einer Datei, die ich mit TextIO gelesen habe. Wenn ich System.out.println(row.get("timestamp")) bekomme ich tatsächlich UNIX-Zeitstempel. Wenn ich System.out.println(row.get("timestamp").getClass().getName()) mache, dann bekomme ich java.lang.double. was ich habe, ist wie folgt:Konvertieren von java.lang.double zu org.joda.time.Instant

static class ExtractTimestamp extends DoFn<TableRow, TableRow> { 
    @Override 
    public void processElement(ProcessContext c) { 
     TableRow row = c.element(); 
     Instant timestamp = (Instant) row.get("timestamp"); 
     c.outputWithTimestamp(row, timestamp); 
    } 
} 

Der Fehler Ich erhalte ist:

java.lang.Double cannot be cast to org.joda.time.Instant

Das Problem ist, dass ich die UNIX-Zeitstempel werfen wollen, die Instants in Doppel sind so kann ich Übergeben Sie es an outputWithTimestamp. Ich glaube, das sollte ein triviales Problem sein, aber ich konnte die Lösung noch nicht finden. Vielen Dank.

+1

Im UNIX-Zeitstempel in Millisekunden, Sekunden, Tage? –

+2

* "java.lang.Double kann nicht gecastet werden ..." * Bitte beachten Sie den "kleinen" Unterschied zwischen dem Objekttyp 'Double' und dem primitiven Typ' double'! –

Antwort

4

Sie können Double nicht in eine Instant "umwandeln". Sie benötigen eine Zeitstempel als constructor argument weitergeben müssen:

Instant timestamp = new Instant(((Number)row.getTimestamp("timestamp")).longValue()); 

Dies setzt voraus, der „Zeitstempel“ Wert in Millisekunden. Wenn es Sekunden ist, multiplizieren Sie einfach mit 1000.

+0

Vielen Dank. Ich habe diesen Ansatz auch ausprobiert, was ich vermisste ('Number') und' .longValue() '. Dies war sehr hilfreich, nochmals vielen Dank. – plumSemPy

Verwandte Themen