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,但是这段代码有两个问题:

  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

另一种选择-也埋在jaxb api中-(不需要Jodatime):

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

高温高压

于 2011-06-12T07:40:23.167 回答
1

我认为最优雅的方法是使用Joda-Time库。您需要 ISO 8601(第 5.4 节)格式(由xs:dateTimeXSD 类型表示):

 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.dd HH: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

Trail: Date Time了解有关现代日期时间 API *的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

于 2021-05-09T20:52:35.723 回答