字符串日期到xmlgregoriancalendar转换

Jav*_*ent 31 java string date

我写过这个函数:

public static XMLGregorianCalendar getXMLGregorianCalendar(String date) throws OmniException{
    XMLGregorianCalendar xmlCalender=null;
    GregorianCalendar calender = new GregorianCalendar();
    calender.setTime(Util.stringToJavaDate(date));
    xmlCalender = DatatypeFactory.newInstance().newXMLGregorianCalendar(calender);
    return xmlCalender;
}

public static Date  stringToJavaDate(String sDate)  throws OmniException{
    Date date=null;
    date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).parse(sDate);        
    return date;  
}
Run Code Online (Sandbox Code Playgroud)

当我将"2014-01-07"输出日期作为2014-01-06T18:30:00:000Z 我出错的地方时,我正在通过日期?如果我想得到什么怎么办,2014-01-06T18:30:00并且2014-01-06T18:30:00Z
感谢任何帮助

Jav*_*ent 32

找到解决方案如下....发布它,因为它可以帮助其他人:)

DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = format.parse("2014-04-24 11:15:00");

GregorianCalendar cal = new GregorianCalendar();
cal.setTime(date);

XMLGregorianCalendar xmlGregCal =  DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);

System.out.println(xmlGregCal);
Run Code Online (Sandbox Code Playgroud)

输出:

2014-04-24T11:15:00.000 + 02:00

  • 在解析了Date并设置GregorianCalendar的时间之后,您可以将日历作为参数传递给newXMLGregorianCalendar(GregorianCalendar cal) (5认同)

gil*_*des 22

对我来说,最优雅的解决方案就是这个:

XMLGregorianCalendar result = DatatypeFactory.newInstance()
    .newXMLGregorianCalendar("2014-01-07");
Run Code Online (Sandbox Code Playgroud)

使用Java 8.

扩展示例:

XMLGregorianCalendar result = DatatypeFactory.newInstance()
    .newXMLGregorianCalendar("2014-01-07");
System.out.println(result.getDay());
System.out.println(result.getMonth());
System.out.println(result.getYear());
Run Code Online (Sandbox Code Playgroud)

打印出:

7
1
2014
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 5

太长了;博士

\n\n
    \n
  • 使用现代java.time尽可能
  • \n
  • 始终指定所需/预期的时区或相对于 UTC 的偏移量,而不是隐式依赖 JVM\xe2\x80\x99s 当前默认值。
  • \n
\n\n

示例代码(无异常处理):

\n\n
XMLGregorianCalendar xgc = \n    DatatypeFactory                           // Data-type converter.\n    .newInstance()                            // Instantiate a converter object.\n    .newXMLGregorianCalendar(                 // Converter going from `GregorianCalendar` to `XMLGregorianCalendar`.\n        GregorianCalendar.from(               // Convert from modern `ZonedDateTime` class to legacy `GregorianCalendar` class.\n            LocalDate                         // Modern class for representing a date-only, without time-of-day and without time zone.\n            .parse( "2014-01-07" )            // Parsing strings in standard ISO 8601 format is handled by default, with no need for custom formatting pattern. \n            .atStartOfDay( ZoneOffset.UTC )   // Determine the first moment of the day as seen in UTC. Returns a `ZonedDateTime` object.\n        )                                     // Returns a `GregorianCalendar` object.\n    )                                         // Returns a `XMLGregorianCalendar` object.\n;\n
Run Code Online (Sandbox Code Playgroud)\n\n

将仅日期输入字符串解析为对象XMLGregorianCalendar对象

\n\n

尽可能避免可怕的遗留日期时间类,例如XMLGregorianCalendarGregorianCalendarCalendarDate。仅使用现代java.time类。

\n\n

当出现诸如 之类的字符串时"2014-01-07",解析为LocalDate.

\n\n
LocalDate.parse( "2014-01-07" )\n
Run Code Online (Sandbox Code Playgroud)\n\n

要获取包含一天中时间的日期,假设您想要一天中的第一时刻,请指定时区。让java.time确定一天中的第一个时刻,因为在某些日期的某些区域中,它并不总是 00:00:00.0。

\n\n
LocalDate.parse( "2014-01-07" )\n         .atStartOfDay( ZoneId.of( "America/Montreal" ) )\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会返回一个ZonedDateTime对象。

\n\n
ZonedDateTime zdt = \n        LocalDate\n        .parse( "2014-01-07" )\n        .atStartOfDay( ZoneId.of( "America/Montreal" ) )\n;\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

zdt.toString() = 2014-01-07T00:00-05:00[美国/蒙特利尔]

\n
\n\n

但显然,您希望以 UTC 格式显示一天的开始时间(零小时-分钟-秒的偏移量)。所以我们指定ZoneOffset.UTC常量作为我们的ZoneId参数。

\n\n
ZonedDateTime zdt = \n        LocalDate\n        .parse( "2014-01-07" )\n        .atStartOfDay( ZoneOffset.UTC )\n;\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

zdt.toString() = 2014-01-07T00:00Z

\n
\n\n

Z的 表示 UTC(偏移量为零),发音为 \xe2\x80\x9cZulu\xe2\x80\x9d。

\n\n

如果您必须使用遗留类,请转换为GregorianCalendar,它的子类Calendar.

\n\n
GregorianCalendar gc = GregorianCalendar.from( zdt ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

gc.toString() = java.util.GregorianCalendar[时间=1389052800000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings= 0,useDaylight = false,转换= 0,lastRule = null],firstDayOfWeek = 2,minimalDaysInFirstWeek = 4,ERA = 1,YEAR = 2014,MONTH = 0,WEEK_OF_YEAR = 2,WEEK_OF_MONTH = 2,DAY_OF_MONTH = 7,DAY_OF_YEAR = 7 ,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=0,DST_OFFSET=0]

\n
\n\n

显然,您确实需要一个遗留类的对象XMLGregorianCalendar。如果调用代码无法更新为使用java.time,请进行转换。

\n\n
XMLGregorianCalendar xgc = \n        DatatypeFactory\n        .newInstance()\n        .newXMLGregorianCalendar( gc ) \n;\n
Run Code Online (Sandbox Code Playgroud)\n\n

实际上,该代码需要 try-catch。

\n\n
try\n{\n    XMLGregorianCalendar xgc =\n            DatatypeFactory\n                    .newInstance()\n                    .newXMLGregorianCalendar( gc );\n}\ncatch ( DatatypeConfigurationException e )\n{\n    e.printStackTrace();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

xgc = 2014-01-07T00:00:00.000Z

\n
\n\n

将所有这些放在一起,并进行适当的异常处理。

\n\n
// Given an input string such as "2014-01-07", return a `XMLGregorianCalendar` object\n// representing first moment of the day on that date as seen in UTC. \nstatic public XMLGregorianCalendar getXMLGregorianCalendar ( String input )\n{\n    Objects.requireNonNull( input );\n    if( input.isBlank() ) { throw new IllegalArgumentException( "Received empty/blank input string for date argument. Message # 11818896-7412-49ba-8f8f-9b3053690c5d." ) ; }\n    XMLGregorianCalendar xgc = null;\n    ZonedDateTime zdt = null;\n\n    try\n    {\n        zdt =\n                LocalDate\n                        .parse( input )\n                        .atStartOfDay( ZoneOffset.UTC );\n    }\n    catch ( DateTimeParseException e )\n    {\n        throw new IllegalArgumentException( "Faulty input string for date does not comply with standard ISO 8601 format. Message # 568db0ef-d6bf-41c9-8228-cc3516558e68." );\n    }\n\n    GregorianCalendar gc = GregorianCalendar.from( zdt );\n    try\n    {\n        xgc =\n                DatatypeFactory\n                        .newInstance()\n                        .newXMLGregorianCalendar( gc );\n    }\n    catch ( DatatypeConfigurationException e )\n    {\n        e.printStackTrace();\n    }\n\n    Objects.requireNonNull( xgc );\n    return xgc ;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

用法。

\n\n
String input = "2014-01-07";\nXMLGregorianCalendar xgc = App.getXMLGregorianCalendar( input );\n
Run Code Online (Sandbox Code Playgroud)\n\n

转储到控制台。

\n\n
System.out.println( "xgc = " + xgc );\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

xgc = 2014-01-07T00:00:00.000Z

\n
\n\n

现代日期时间类与传统日期时间类

\n\n

Java 中的日期时间类型表(现代和传统)

\n\n

日期时间 != 字符串

\n\n

不要将日期时间值与其文本表示形式混为一谈。我们解析字符串以获取日期时间对象,然后要求日期时间对象生成一个字符串来表示其值。日期时间对象没有 \xe2\x80\x98format\xe2\x80\x99,只有字符串有格式。

\n\n

因此,请将您的思维转变为两种不同的模式:模型和演示。确定您想要的日期值,应用适当的时区作为模型。当您需要显示该值时,请按照用户的预期生成特定格式的字符串。

\n\n

避免遗留日期时间类

\n\n

问题和其他答案都使用旧的麻烦的日期时间类,现在已被 java.time 类取代。

\n\n

ISO 8601

\n\n

您的输入字符串"2014-01-07"采用标准ISO 8601格式。

\n\n

中间T的分隔日期部分和时间部分。

\n\n

末尾Z的 是 Zulu 的缩写,意思是UTC

\n\n

幸运的是,java.time 类在解析/生成字符串时默认使用 ISO 8601 格式。因此无需指定格式模式。

\n\n

LocalDate

\n\n

该类LocalDate表示仅日期值,没有时间和时区。

\n\n
LocalDate ld = LocalDate.parse( "2014-01-07" ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

ld.toString(): 2014-01-07

\n
\n\n

一天的开始ZonedDateTime

\n\n

如果您想查看当天的第一个时刻,请指定一个ZoneId时区以获取时间线上的某个时刻,即ZonedDateTime. 时区至关重要,因为全球各地的日期因地区而异。法国巴黎午夜过后几分钟又是新的一天,而 Montr\xc3\xa9al Qu\xc3\xa9bec 中的 \xe2\x80\x9cyesterday\xe2\x80\x9d 仍是新的一天。

\n\n

永远不要假设一天是从 00:00:00 开始的。夏令时 (DST) 等异常情况意味着这一天可能会在一天中的另一个时间开始,例如 01:00:00。让 java.time 确定第一时刻。

\n\n
ZoneId z = ZoneId.of( "America/Montreal" ) ;\nZonedDateTime zdt = ld.atStartOfDay( z ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

zdt.toString(): 2014-01-07T00:00:00Z

\n
\n\n

对于您想要的格式,使用预定义的格式化程序生成一个字符串DateTimeFormatter.ISO_LOCAL_DATE_TIME,然后T用空格替换中间的字符串。

\n\n
String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )\n                   .replace( "T" , " " ) ; \n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

2014-01-07 00:00:00

\n
\n\n
\n\n

关于 java.time

\n\n

java.time框架内置于 Java 8 及更高版本中这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

\n\n

Joda -Time项目现在处于维护模式,建议迁移到java.time类。

\n\n

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

\n\n

从哪里获取 java.time 类?

\n\n\n\n

ThreeTen -Extra项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval、、、等等。YearWeekYearQuarter

\n

  • 这与将“java.time”对象的字符串表示形式转换为“XMLGregorianCalendar”无关。 (2认同)