1

Parse (parse.com) が sqlite テーブルに格納した日時文字列を joda-time でフォーマットする際に問題が発生しています。

Sqlite 作成文字列: "createdDate date time"

解析日をテーブルに格納: "挿入... parseObject.getCreatedAt()"

その後、SQLite ブラウザーを使用してテーブルを調べると、日付が次のように格納されていることがわかります。

2013 年 6 月 15 日(土)15:44:52 PDT

それに沿って、テーブルに最後に挿入されたアイテムよりも新しいアイテムを取得するクエリの一部として解析するために、DateTime オブジェクトに戻すために次のように記述しました。

 DateTimeFormatter format = DatetimeFormat.forPattern("yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSS'Z'");
 DateTime dt = formatter.parseDateTime(datahelper.getLastInsertDate(..));

Parse の databrowser では、dateTimes が次のように格納されていることがわかるため、フォーマッタはこのようになっています。

2013-06-24T08:11:45.280Z

ただし、ANR が発生するので、次のフォーマッタを使用してみました。

DateTimeFormatter format = DatetimeFormat.forPattern("EEE' 'MMM' 'dd' 'HH':'mm':'ss 'z'' 'YYYY");
DateTime dt = formatter.parseDateTime(datahelper.getLastInsertDate(..));

それでもANRが発生します。Eclipse のトレースは、次のことを示しています。

原因: java.lang.IllegalArgumentException: 無効な形式: "Tue Jun 25 00:13:29 PDT 2013" at org.joda.time.format.DateTimeFormatter.parseDateTime"

2 番目の ANR トレースは次のことを示しています。

無効な形式: "Tue Jun 25 00:13:29 PDT 2013" は "PDT 2013" で不正な形式です

joda time は「z」を PDT/PST に解析しないため、それを回避しようとしました。そのため、フォーマッターに「PDT」を入れてうまく機能させようとしましたが、何も機能していないようです。

何か案は?

編集1:受け入れられた回答を使用すると、タイムゾーンのフォーマットの問題があります)

DateFormat originalFormat = new SimpleDateFormat("EEE MMM DDD HH:mm:ss z yyyy");
Date originaldate = originalFormat.parse(datahelper.getLastInsertdate);
Log.i("converted date: ", String.valueOf(originalDate);
Log.i("a real date: ", "String.valueOf(new Date(new Date().getTime)));

2 つの出力が得られます。

2013 年 1 月 25 日金曜日 15:14:11 PST

2013 年 6 月 25 日 (火) 17:11:44 PDT

変換された日付には PST が表示され、標準の日付には PDT が表示されるのはなぜですか?

4

2 に答える 2

0

SQLite では、日付型が多少壊れているため、Date.getTime() または関連する Joda メソッドから取得した long を格納するのが最善の方法だと思います。

データベースから long を取得したら、日付オブジェクト (new Date(long) など) を再構築し、それをフォーマットします。

とりわけ、(IMHO) 日付を格納する唯一の賢明な方法は、UTC を参照することです。これは、 Date.getTime() および new Date(long) : 1970 年 1 月 1 日 UTC からのミリ秒で得られるものです。

日付を取得したら、適切なタイムゾーンでフォーマットします。

于 2013-06-26T00:17:58.530 に答える