3

有効な形式の日付を含むXMLを生成していますが、オフセットもXML含める必要があります。UTC

私は使用しgroovyていますが、代わりに使用しているコードを表示しJavaます(どちらの言語でも答えが良いです):

Calendar c = Calendar.getInstance();  
long timeZoneOffset = c.timeZone.getOffset(c.getTimeInMillis())/(1000*60*60);
SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
formatter.format(c.getTime()) + "+0" + timeZoneOffset + ":00";

上記のコードは私2011-06-12T07:23:25.000+03:00にgive4sを与えますが、このコードには2つの問題があります。

  1. それは醜いです、そしておそらくこれをするための最良の方法ではありません
  2. インド(GMT +5:30)、ネパール(GMT +5:45)などのタイムゾーンでは機能しません

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z")タイムゾーンに使用してみましたが、(の代わりに)2011-06-12T07:23:25.000+0300正しい形式ではありませんでした。+0300+03:00

日付を必要な方法でフォーマットする他の方法はありますか?(できればサードパーティなしで)

4

5 に答える 5

2

もう1つの選択肢-これもjaxbapiに埋め込まれています-(Jodatimeは必要ありません):

    Calendar c = ...
    String printDate = javax.xml.bind.DatatypeConverter.printDateTime(c);

HTH

于 2011-06-12T07:40:23.167 に答える
1

最もエレガントな方法は、 Joda-Timeライブラリを使用することだと思います。xs:dateTimeISO 8601(セクション5.4)形式( XSDタイプで表される)が必要です。

 DateTime dt = new DateTime();
 DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
 System.out.println(fmt.print(dt));

結果:

2011-06-12T07:36:32.294 + 02:00

于 2011-06-12T05:41:48.957 に答える
0

使ってみましたXMLGregorianCalendarか?例えば:

Calendar c = ...
DataTypeFactory f = DataTypeFactory.newInstance();
XMLGregorianCalendar xc = f.newXMLGregorianCalendar(c);
String str = xc.toXMLFormat();

カレンダーがタイムゾーンオフセットのある日時である場合、タイムゾーンオフセットは、XMLデータ型の仕様に従ってフォーマットされた結果の文字列に含める必要があります。

于 2011-06-12T07:28:25.763 に答える
0

SimpleDataFormat http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html は、タイムゾーンにコロン「:」を含むXのフォーマット指定文字をサポートします。タイムゾーンに関するセクション、特に「ThreeLetterISO8601TimeZone」に関するセクションを読む価値があります。

フォーマット文字列「yyyy.MM.ddHH:mm:ss.sssXXX」を使用すると、2015.05.07 15:06:58.058 + 10:00になりました

于 2015-05-07T05:39:43.163 に答える
0

java.time

最新の日時API *は、実行を容易にするだけでなく、ソリューションも明快で自然に見えます。

デモ:

import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        ZonedDateTime zdtNewYork = ZonedDateTime.now(ZoneId.of("America/New_York"));
        ZonedDateTime zdtIndia = ZonedDateTime.now(ZoneId.of("Asia/Kolkata"));
        ZonedDateTime zdtNepal = ZonedDateTime.now(ZoneId.of("Asia/Kathmandu"));
        System.out.println(zdtNewYork);
        System.out.println(zdtIndia);
        System.out.println(zdtNepal);

        // If you do not need to display the time zone name, convert it into
        // OffsetDateTime
        OffsetDateTime odtNewYork = zdtNewYork.toOffsetDateTime();
        System.out.println(odtNewYork);

        // Using DateTimeFormatter, you can display it in different formats
        String odtFormat = zdtNewYork.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME.withLocale(Locale.ENGLISH));
        String dayMonFullNameFormat = zdtNewYork.format(DateTimeFormatter.ofPattern("EEEE d MMMM uuuu HH:mm:ssXXX"));
        System.out.println(odtFormat);
        System.out.println(dayMonFullNameFormat);
    }
}

出力:

2021-05-09T16:41:23.683709-04:00[America/New_York]
2021-05-10T02:11:23.685131+05:30[Asia/Kolkata]
2021-05-10T02:26:23.685187+05:45[Asia/Kathmandu]
2021-05-09T16:41:23.683709-04:00
2021-05-09T16:41:23.683709-04:00
Sunday 9 May 2021 16:41:23-04:00

最新の日時API *の詳細については、Trail DateTimeをご覧ください。


*何らかの理由で、Java6またはJava7に固執する必要がある場合は、 Java.time機能のほとんどをJava6および7にバックポートするThreeTen-Backportを使用できます。AndroidプロジェクトおよびAndroidAPIで作業している場合レベルはまだJava-8に準拠していません。脱糖によって利用可能なJava8+APIAndroidプロジェクトでのThreeTenABPの使用方法を確認してください。

于 2021-05-09T20:52:35.723 に答える