web-dev-qa-db-ja.com

ナノ秒での文字列-日付変換

Androidアプリのコードのこの部分でしばらく苦労してきましたが、こつをつかむことができません。stackoverflowで見つけたすべてのソリューションを読んで試してみました。他の場所ですが、まだ運がありません。

私がやりたいのは、"17.08.2012 05:35:19:7600000"のような文字列をUTC日付に変換する関数と、UTC dateを受け取ってそれをそのような文字列に変換する関数です。

String value = "17.08.2012 05:35:19:7600000";
DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss:SSSSSSS");
try
{
  Date today = df.parse(value);
  System.out.println("Today = " + df.format(today) + " " + today.toGMTString());
} 
catch (ParseException e)
{
  e.printStackTrace();
}

これは:Today = 17.08.2012 07:41:59:0000000 17 Aug 2012 04:41:59 GMTとなり、どちらも間違っています。

SDF's timezoneUTCに設定してみましたが、うまくいきませんでした。
もう1つ気づいたこと:する場合df.setLenient(false);
それは私に与えます:Java.text.ParseException: Unparseable date: "17.08.2012 05:35:19:7600000"

誰かが私にいくつかの説明/サンプルコードを提供できるならば、私はとても感謝しています。前もって感謝します

15
Rhadoozooz

あなたが得ている結果は完全に正しいです。

これを分析しましょう:

17.08.2012 05:35:19:7600000
  • 17:月の日(17日)
  • 08:月(8月)
  • 2012:年(2012)
  • 05:時間(午前5時)
  • 35:分(:35)
  • 19:分の秒(:19)
  • 7600000:ミリ秒(7,600,000)

VMがこれを見る方法は、時刻を5:35:19 amと宣言し、それに7,600,000ミリ秒を追加することです。7,600,000ミリ秒= 7,600秒= 2時間6分、40秒5:35:19 am + 02:06:40 = 7:41:59 am(および0ミリ秒)これは得られた結果です(タイムゾーンを適切に設定していないようにも見えるため、 GMT文字列は、結果より3時間遅れます。)

:7600000を保持したい場合、私の知る限り、これは不可能です。これは秒に簡略化できるため、VMは自動的にそれを他の時間増分に減らします。ミリ秒(SSSS)は、1000未満の値を格納するためのものです。

出力用に新しいSimpleDateFormatを作成することをお勧めします。ただし、ミリ秒は他の時間に吸収されることを覚えておいてください(それらはすべてlongオブジェクトに単一のDateとして格納されているため)。

22
Eric
    private String convertDate(String cdate)
{
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss:SSSSSSS");
    SimpleDateFormat postFormater = new SimpleDateFormat("yyyy-MM-dd");
    Date convertedDate;
    try
    {
        convertedDate = dateFormat.parse(cdate);
        cdate = postFormater.format(convertedDate);
    }
    catch (ParseException e)
    {
        Toast.makeText(getApplicationContext(),e.toString(),Toast.LENGTH_SHORT).show();
    }
    return cdate;
}

これを試して。

6
Rajesh Rajaram

これが必要なものです(ただし、ミリ秒の情報が失われます)。

"dd.MM.yyyy HH:mm:ss.'000000'"

"dd.MM.yyyy HH:mm:ss.SSSSSS"を使用すると、ミリ秒の間に3つの先行ゼロが付きます。

"dd.MM.yyyy HH:mm:ss.SSS'000'"を使用した場合、日付をフォーマットできますが、日付を解析できません。

やってみよう:

public static void main(String[] args) throws ParseException {
    printDate("dd.MM.yyyy HH:mm:ss.SSS");//02.05.2010 21:45:58.073
    printDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//02.05.2010 21:45:58.000073
    printDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//02.05.2010 21:45:58.073000
    printDate("dd.MM.yyyy HH:mm:ss.'000000'");//02.05.2010 21:45:58.000000

    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS");//good
    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//good
    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//bad
    tryToParseDate("dd.MM.yyyy HH:mm:ss.'000000'");//good
}

private static void printDate(String formatString) {
    Date now = new Date();
    SimpleDateFormat format = new SimpleDateFormat(formatString);
    String formattedDate = format.format(now);

    // print that date
    System.out.println(formattedDate);
}

private static void tryToParseDate(String formatString) {
    Date now = new Date();
    SimpleDateFormat format = new SimpleDateFormat(formatString);
    String formattedDate = format.format(now);

    // try to parse it again
    try {
        format.parse(formattedDate);
        System.out.println("good");
    } catch (ParseException e) {
        System.out.println("bad");
    }
}
3
slartidan

ナノ秒を落とすには、以下を使用します。

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.")
0
Henry