Klassen Zeit aus NMEA-Stream in SimpleDateFormat

  • Themenstarter Themenstarter d9
  • Beginndatum Beginndatum

d9

Mitglied
ich hätte da noch eine frage und zwar habe ich standardmäßig die GMT-Zeit in die Datenbank gespeichert:

Java:
private final DateFormat timestampFormat = new SimpleDateFormat("yyyyMMddHHmmss");
GregorianCalendar greg = new GregorianCalendar();
                        TimeZone tz = greg.getTimeZone();
                        int offset = tz.getOffset(System.currentTimeMillis());
                        greg.add(Calendar.SECOND, (offset/1000) * -1);;
                        StringBuffer queryBuf = new StringBuffer();
                        queryBuf.append("INSERT INTO "+POINTS_TABLE_NAME+
                                " (GMTTIMESTAMP,LATITUDE,LONGITUDE,ALTITUDE,ACCURACY,SPEED,BEARING) VALUES (" +
                                "'"+timestampFormat.format(greg.getTime())+"',"+
                                loc.getLatitude()+","+...
jetzt möchte ich aber die GPS-Zeit in die Datenbank hineinspeichern, die aus dem NMEA Stream herausgelesen wird:

Java:
public void onNmeaReceived(long timestamp, String nmea) {
                
                if (!nmea.startsWith(NMEA_RMC))
                      return ;
                  // extract time, date
                  String[] tokens = nmea.split(",");
                  String utcTime = tokens[1];
                  String utcDate = tokens[9];
        
                  // parse
                  DateFormat df = new SimpleDateFormat("HHmmss.S ddMMyy Z");
                  String GPSTime = utcTime + " " + utcDate + " +0000";

wie bringe ich die GPSTime, die nur aus 2 Strings besteht, in das SimpleDateFormat "timestampFormat" (damit auch beim SELECT ein ORDER BY GMTTIMESTAMP ASC möglich ist)?
 
> GPSTime, die nur aus 2 Strings besteht
??

jeder Zeitwert wird irgendwie vorliegen, Date, String, oder sonst ein Format,
das musst du jetzt klären, Beispiel wäre auch nützlich

dem Code und ungenauen Erklärungen ( 😉 ) nach sieht es nach einem String aus,
den könntest du mit einem passenden SimpleDateFormat in ein Date-Objekt parsen, damit auch Calendar, falls nötig,
und dann eben mit dem anderen Format wieder in einen String

überlege auch, ob du PreparedStatement nutzen kannst und willst, dann kannst du das Date-Objekt an sich übergeben
 
der NMEA-Stream vom GPS-Empfänger sieht z.B folgendermaßen aus:

$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A

(Quelle: NMEA data)

daraus ziehe ich aus dem 1. Token die Zeit (in diesem Fall 123519) und aus dem 9. Token das Datum (230394), anschließend speichere ich diese beiden als Strings ab.

und jetzt müsste ich diese beiden Strings irgendwie in ein Format bekommen, ähnlich wie bei
timestampFormat.format(greg.getTime()) , sodass ich diesen Wert in die Spalte GMTTIMESTAMP speichern und anschließend ein "SELECT * FROM POINTS_TABLE_NAME ORDER BY GMTTIMESTAMP ASC" durchführen kann
 
Bsp.

greg.getTime() liefert mir "Tue Feb 07 10:10:00 GMT 2012"

durch das timestampFormat = new SimpleDateFormat("yyyyMMddHHmmss") wird mir bei timestampFormat.format(greg.getTime()) der Wert "20120207101000" gespeichert. und genau in diesem Format möchte ich auch meine 2 vereinten Strings
 
die letzten 3 Zeilen (edit: im Posting von 10:57) sind Wiederholung, nebenbei,

"123519 230394" also, interessantes Datum, also ich weiß nicht was das für ein Datum ist,
aber noch eben schnell nachgeschlagen in deinem Link, was du dir zu zitieren erspart hast (jetzt höre ich aber auf zu meckern 😉 ) :
Where:
RMC Recommended Minimum sentence C
123519 Fix taken at 12:35:19 UTC
[..]
230394 Date - 23rd of March 1994

puh, das sind dann ja doch normale Werte,
du hast ja auch schon selber ein DateFormat gepostet
Java:
 DateFormat df = new SimpleDateFormat("HHmmss.S ddMMyy Z");
gibt es damit Probleme?
wie gesagt: den String GPSTime kannst du mit dem SimpleDateFormat in ein Date parsen und dann mit einem anderen SimpleDateFormat in ein anderes String-Format formatieren

was genau ist daran problematisch oder noch unverständlich?
 
Zuletzt bearbeitet von einem Moderator:
also das Datum war aber meiner Meinung nach schon leicht verständlich 😀

ja mit dem definierten DateFormat bekam ich immer einen SQL-Error, da der Wert anscheinend nicht sortierbar (ASC) ist, deshalb dachte ich mir ich muss doch irgendwie den Wert "123519 230394" in die Datenbank speichern können, sodass ich ein "SELECT * FROM POINTS_TABLE_NAME ORDER BY GMTTIMESTAMP ASC" ausführen kann und mir alle jüngsten Einträge ganz oben stehen
 
ich verstehe deine Rückfrage nicht oder was immer du postest,
meine Aussage ist, dass du mit den beiden SimpleDateFormats den String "123519 230394 +0000" in "19940323123519"
umwandeln kannst, denn das habe ich als dein Ziel verstanden,

geht das bei dir, ja oder nein, hast du Fragen dazu?
bitte nur auf die beiden Strings konzentrieren und in Folgepostings nicht mehr Buchstabenkombinationen wie "DB", "ASC", "SQL" usw. erwähnen
 
> meine Aussage ist, dass du mit den beiden SimpleDateFormats den String "123519 230394 +0000" in >"19940323123519" umwandeln kannst, denn das habe ich als dein Ziel verstanden,

genau das will ich ja genau
 
Zusammenfassung:
in drei Postings von mir steht
den könntest du mit einem passenden SimpleDateFormat in ein Date-Objekt parsen, damit auch Calendar, falls nötig,
und dann eben mit dem anderen Format wieder in einen String
+
wie gesagt: den String GPSTime kannst du mit dem SimpleDateFormat in ein Date parsen und dann mit einem anderen SimpleDateFormat in ein anderes String-Format formatieren

was genau ist daran problematisch oder noch unverständlich?
+
geht das bei dir, ja oder nein, hast du Fragen dazu?

-------

und dein kompletter Beitrag dazu ist
genau das will ich ja genau
unter Ignorierung sämtlicher Vorschläge/ inhaltlichen Nachfragen (die quasi-Nachfrage zum Ziel hast du ja beantwortet)

was soll ich jetzt noch posten außer der Komplettlösung, auch wenn es nur zwei, evtl. eine Code-Zeile ist? ???:L
 
> was soll ich jetzt noch posten außer der Komplettlösung, auch wenn es nur zwei, evtl. eine Code-Zeile ist?

Die Nachfrage zum Ziel habe ich nicht beantwortet, genau vor diesem Problem stehe ich ja.

Und wenn du Vorschläge gibst wie "mit einem passenden SimpleDateFormat in ein Date-Objekt parsen, damit auch Calendar, falls nötig" oder "SimpleDateFormat in ein Date parsen und dann mit einem anderen SimpleDateFormat in ein anderes String-Format formatieren" dann hilft mir das auch nicht weiter, denn genau aus diesem Grund bzw. weil ich vor diesem Problem stehe habe ich das Forum benützt!
 
> dann hilft mir das auch nicht weiter
das schreibst du zum ersten Mal, bisher habe ich von dir keine Rückmeldung zu meinem Vorschlag bekommen

natürlich ist das auch nicht gerade ausführlich,
aber gut, wenn du schon soviele Postings schreiben musst, dann hast du zumindest Zeit investiert,
und damit ich nicht nur nerve, hier bisschen Code:

Java:
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        String a = "09";
        SimpleDateFormat df1 = new SimpleDateFormat("yy");
        SimpleDateFormat df2 = new SimpleDateFormat("yyyy");
        Date date = df1.parse(a);
        String b = df2.format(date);
        System.out.println(b); // Ausgabe 2009, einen String in ein anderes Format formatiert
    }
}
siehst du nun was ich meine, kannst du irgendwas dazu sagen?
 
aber ehrlich, ich poste doch etwas in einem Forum um Lösungsvorschläge zu bekommen und keine Schritte, wie ich zur Lösung komme, oder? 😛

ok dein Beispiel verstehe ich jetzt, d.h. es müsste dann bei

Java:
DateFormat timestampFormat = new SimpleDateFormat("yyyyMMddHHmmss");
DateFormat df = new SimpleDateFormat("HHmmss.S ddMMyy Z");

String dateStr = "123519" + " " + "230394" + " +0000";

try {
	Date date1 =df.parse(dateStr);
	String GPSTime = timestampFormat .format(date1);		    	  		
} catch (ParseException e) {
	return;
}

für den String GPSTime mein gewünschter Wert "19940323123519" herauskommen?
 
Ich habe die Diskussion kopfschüttelnd gelesen - entweder ich habe etwas verpasst, oder es gibt hier einige Missverständnisse:

Ja ich habe auch schon NMEA ausgewertet, allerdings war damals das Datum und die Zeit unwichtig.

... den String "123519 230394 +0000" in "19940323123519" umwandeln ...

Das braucht doch keinen Calendar kein Date gar nichts - das sind reine Stringoprationen

Wenn es im NMEA echt keine Information zum Jahrtausend hat, muss man halt "Vermutungen" anstellen, wenn man archivierte Daten verarbeiten will.

Im Livebetrieb: Konstant "20" und dann immer brav die entsprechenden Digits anhängen ...

Wenn die Übertragung vom GPS fehlerbehaftet sein sollte (war sie zwar bei mir damals nicht) könnte man die schon erwähnten Mechanismen zur Prüfung des Resultates einsetzen.
 
@d9
also was immer du im Forum machst, ich wiederum kopiere nicht deinen Code, lasse ihn bei mir laufen und sage dann ob er funktioniert 😉
(edit: also ich kopiere vielleicht schon, aber sage dann nichts)

Tipp: Exceptions ausgeben
 
Zuletzt bearbeitet von einem Moderator:
@andi_ch
ich habe keinen blassen schimmer was du meinst sry...btw, das Datum war nur frei gewählt falls du das meintest...

@SlaterB

ist mir schon klar dass du das nicht selbst probieren wirst, aber laut der Logik aus deinem vorigen Post müsste das normal klappen oder??
Exception ist übrigens:

02-07 11:48:38.876: E/GPSLoggerService(23212): java.text.ParseException: Unparseable date: 123519 230394 +0000
 
Andi_CH meint dass man alle Zeichen, alle Ziffern nur hin und her sortieren muss, bei 94 vielleicht noch 19 davor ergänzen usw.,
ist eine Variante

> laut der Logik aus deinem vorigen Post müsste das normal klappen oder??
es ist dieselbe Logik angewandt, ja

wenn Fehler mit drin sind muss es dadurch natürlich nicht direkt klappen,

falls ich mir wieder ein Anleitung statt direkte Lösung (ohne Arbeit/ Denkprozess bei dir) erlauben darf:
fange so einfach an wie ich, erstmal nur das Jahr mit yy, danach die Monate ergänzen usw.,
den String erweitern + gleichzeitig das Format, an welcher Stelle kracht es?
 
Zuletzt bearbeitet von einem Moderator:
ok so funktioniert es jetzt! anscheinend waren die Leerzeichen im SimpleDateFormat zu viel...
Java:
DateFormat timedatef=new SimpleDateFormat("ddMMyyHHmmss");
DateFormat test=new SimpleDateFormat("yyyyMMddHHmmss");

String dateStr = "230394";
String timeStr = "123519";

String dateandtime = dateStr+timeStr;

Date timeanddate = timedatef.parse(dateandtime);

GPSTime = test.format(timeanddate);


Danke nochmals! 🙂
 
Nur noch etwas hinten nach - ich bemerke halt eben oft so genannten overkill und den "bekämpfe" ich gerne. Gerade weil ich auch immer Mühe mit den Format-Pattern habe, habe ich eine gewisse Kreativität entwickelt ;-)

Java:
public class NMEA {

	private static String dateStr = "230394";
	private static String timeStr = "123519";
	
	private static final int YEAR_OFFSET = 4;
	private static final int MONTH_OFFSET = 2;
	private static final int DAY_OFFSET = 0;

	public static void main(String... args) {
		String resultat = "19";
		resultat += dateStr.substring(YEAR_OFFSET);
		resultat += dateStr.substring(MONTH_OFFSET, YEAR_OFFSET);
		resultat += dateStr.substring(DAY_OFFSET, MONTH_OFFSET);
		resultat += timeStr;
		System.out.println(resultat);
	}
}
 

Zurück
Oben