4

SimpleDateFormat を使用して、どのように文字列を解析できますか: "2013-05-23T09:18:07 pm.380+0000"

すべての SimpleDateFormat 文字列が「pm」の部分でつまずいています。

前もって感謝します。

編集: 入ってくるフォーマットを制御することはできません.

私はもう試した:

"yyyy-MM-dd'T'HH:mm:ss a.a..SSSZ"

"yyyy-MM-dd'T'HH:mm:ss aaaa.SSSZ"

"yyyy-MM-dd'T'HH:mm:ss a.'m'..SSSZ"

"yyyy-MM-dd'T'HH:mm:ss a.'m.'.SSSZ"

"yyyy-MM-dd'T'HH:mm:ss a.'m..'SSSZ"

"yyyy-MM-dd'T'HH:mm:ss aa'm'..SSSZ"

"yyyy-MM-dd'T'HH:mm:ss aa'm.'.SSSZ"

"yyyy-MM-dd'T'HH:mm:ss aaa'..'SSSZ"

"yyyy-MM-dd'T'HH:mm:ss aaa.'.'SSSZ"

"yyyy-MM-dd'T'HH:mm:ss aaa'.'.SSSZ"
4

4 に答える 4

13

「380+0000」の部分が何を意味するのかは明確ではありませんが、 に を設定することで、AM/PM の部分を修正できDateFormatSymbolsますSimpleDateFormat。次に例を示します。

import java.util.*;
import java.text.*;

public class Test {
    public static void main(String[] args) throws Exception {
        String text = "2013-05-23T09:18:07 p.m..380+0000";
        String pattern = "yyyy-MM-dd'T'hh:mm:ss aa'.380+0000'";

        SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.US);
        format.setTimeZone(TimeZone.getTimeZone("UTC"));

        DateFormatSymbols symbols = format.getDateFormatSymbols();
        symbols = (DateFormatSymbols) symbols.clone();
        symbols.setAmPmStrings(new String[] { "a.m.", "p.m."});
        format.setDateFormatSymbols(symbols);

        Date date = format.parse(text);
        System.out.println(date);
    }
}  

変異させる前にクローンを作成する必要あるかどうかはわかりませんDateFormatSymbols-正直なところ、明確ではありません...ドキュメントでは2つの方法が指摘されています。

DateFormatSymbols オブジェクトは複製可能です。DateFormatSymbols オブジェクトを取得したら、日時の書式設定データを自由に変更してください。たとえば、ローカライズされた日時形式のパターン文字を、覚えやすい文字に置き換えることができます。または、代表都市をお気に入りの都市に変更することもできます。

クローニングについて言及していることを考えると、それはクローンを作成する必要があることを示唆していますが、その後の段落ではそうではないことを示唆しています:(

于 2013-05-23T22:25:02.267 に答える
2

Java 8 の新しいjava.timeパッケージを使用した実装java.util.Dateを以下に示しますjava.text.SimpleDateFormat

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.HashMap;
import java.util.Map;

public class Test {
    public static void main(String[] args) {
        String text = "2013-05-23T09:18:07 p.m..380+0000";
        Map<Long, String> map = new HashMap<>();
        map.put(0L, "a.m.");
        map.put(1L, "p.m.");
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                .appendPattern("yyyy-MM-dd'T'hh:mm:ss ")
                .appendText(ChronoField.AMPM_OF_DAY, map)
                .appendPattern(".SSSZ").toFormatter();
        OffsetDateTime dateTime = OffsetDateTime.parse(text, formatter);
        System.out.println(dateTime);
    }
}

実行すると、次のようになります。

2013-05-23T21:18:07.380Z
于 2014-06-02T23:32:11.957 に答える
0

このようにしてください

String time="2013-05-23T09:18:07 p.m..380+0000";
        int index1=time.indexOf("");
        int index2 = time.indexOf(".."); // or you can give p.m. as argument if you want it to stop before pm

        String result = time.substring(index1,index2);
        System.out.print(result);

これにより、次の結果が得られます

2013-05-23T09:18:07 p.m 

これが役立つことを願っています

于 2013-05-23T22:42:39.720 に答える
0

文字列操作で pm 部分を削除するだけです。冗長です。

単純な SimpleDateFormat を使用して解析を行うよりも。

これらの行に沿ったもの:

String whatever = "2013-05-23T09:18:07 p.m..380+0000";
        whatever = whatever.replaceAll(" p.m..", ":").replaceAll(" a.m..", ":");
        System.out.println(whatever);

        S   

        String pattern = "yyyy-MM-dd'T'hh:mm:ss:SSS'Z'";

        SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.US);
        Date date;
        try {
            date = format.parse(whatever);
             System.out.println(date);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

アップデート

IAN が指摘したように、時間が 24 時間形式ではないことを見逃していました。ただし、ミリ秒の部分を正しく取得し、タイムゾーンの部分をJon Skeetの回答に追加して取得しました:

String text = "2013-05-23T09:18:07 p.m..380+0000";  
String pattern = "yyyy-MM-dd'T'hh:mm:ss aa'.'SSSZ";
SimpleDateFormat format = new SimpleDateFormat(pattern);

DateFormatSymbols symbols = format.getDateFormatSymbols();
symbols = (DateFormatSymbols) symbols.clone();
symbols.setAmPmStrings(new String[] { "a.m.", "p.m."});
format.setDateFormatSymbols(symbols);

Date date = format.parse(text);
System.out.println(date);
于 2013-05-23T22:21:21.403 に答える