我写过这个函数:
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
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)
示例代码(无异常处理):
\n\nXMLGregorianCalendar 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;\nRun Code Online (Sandbox Code Playgroud)\n\nXMLGregorianCalendar对象尽可能避免可怕的遗留日期时间类,例如XMLGregorianCalendar、GregorianCalendar、Calendar和Date。仅使用现代java.time类。
当出现诸如 之类的字符串时"2014-01-07",解析为LocalDate.
LocalDate.parse( "2014-01-07" )\nRun Code Online (Sandbox Code Playgroud)\n\n要获取包含一天中时间的日期,假设您想要一天中的第一时刻,请指定时区。让java.time确定一天中的第一个时刻,因为在某些日期的某些区域中,它并不总是 00:00:00.0。
\n\nLocalDate.parse( "2014-01-07" )\n .atStartOfDay( ZoneId.of( "America/Montreal" ) )\nRun Code Online (Sandbox Code Playgroud)\n\n这会返回一个ZonedDateTime对象。
ZonedDateTime zdt = \n LocalDate\n .parse( "2014-01-07" )\n .atStartOfDay( ZoneId.of( "America/Montreal" ) )\n;\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\nzdt.toString() = 2014-01-07T00:00-05:00[美国/蒙特利尔]
\n
但显然,您希望以 UTC 格式显示一天的开始时间(零小时-分钟-秒的偏移量)。所以我们指定ZoneOffset.UTC常量作为我们的ZoneId参数。
ZonedDateTime zdt = \n LocalDate\n .parse( "2014-01-07" )\n .atStartOfDay( ZoneOffset.UTC )\n;\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\nzdt.toString() = 2014-01-07T00:00Z
\n
这Z的 表示 UTC(偏移量为零),发音为 \xe2\x80\x9cZulu\xe2\x80\x9d。
如果您必须使用遗留类,请转换为GregorianCalendar,它的子类Calendar.
GregorianCalendar gc = GregorianCalendar.from( zdt ) ;\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\ngc.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
显然,您确实需要一个遗留类的对象XMLGregorianCalendar。如果调用代码无法更新为使用java.time,请进行转换。
XMLGregorianCalendar xgc = \n DatatypeFactory\n .newInstance()\n .newXMLGregorianCalendar( gc ) \n;\nRun Code Online (Sandbox Code Playgroud)\n\n实际上,该代码需要 try-catch。
\n\ntry\n{\n XMLGregorianCalendar xgc =\n DatatypeFactory\n .newInstance()\n .newXMLGregorianCalendar( gc );\n}\ncatch ( DatatypeConfigurationException e )\n{\n e.printStackTrace();\n}\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\nxgc = 2014-01-07T00:00:00.000Z
\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}\nRun Code Online (Sandbox Code Playgroud)\n\n用法。
\n\nString input = "2014-01-07";\nXMLGregorianCalendar xgc = App.getXMLGregorianCalendar( input );\nRun Code Online (Sandbox Code Playgroud)\n\n转储到控制台。
\n\nSystem.out.println( "xgc = " + xgc );\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\nxgc = 2014-01-07T00:00:00.000Z
\n
不要将日期时间值与其文本表示形式混为一谈。我们解析字符串以获取日期时间对象,然后要求日期时间对象生成一个字符串来表示其值。日期时间对象没有 \xe2\x80\x98format\xe2\x80\x99,只有字符串有格式。
\n\n因此,请将您的思维转变为两种不同的模式:模型和演示。确定您想要的日期值,应用适当的时区作为模型。当您需要显示该值时,请按照用户的预期生成特定格式的字符串。
\n\n问题和其他答案都使用旧的麻烦的日期时间类,现在已被 java.time 类取代。
\n\n您的输入字符串"2014-01-07"采用标准ISO 8601格式。
中间T的分隔日期部分和时间部分。
末尾Z的 是 Zulu 的缩写,意思是UTC。
幸运的是,java.time 类在解析/生成字符串时默认使用 ISO 8601 格式。因此无需指定格式模式。
\n\nLocalDate该类LocalDate表示仅日期值,没有时间和时区。
LocalDate ld = LocalDate.parse( "2014-01-07" ) ;\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\nld.toString(): 2014-01-07
\n
ZonedDateTime如果您想查看当天的第一个时刻,请指定一个ZoneId时区以获取时间线上的某个时刻,即ZonedDateTime. 时区至关重要,因为全球各地的日期因地区而异。法国巴黎午夜过后几分钟又是新的一天,而 Montr\xc3\xa9al Qu\xc3\xa9bec 中的 \xe2\x80\x9cyesterday\xe2\x80\x9d 仍是新的一天。
永远不要假设一天是从 00:00:00 开始的。夏令时 (DST) 等异常情况意味着这一天可能会在一天中的另一个时间开始,例如 01:00:00。让 java.time 确定第一时刻。
\n\nZoneId z = ZoneId.of( "America/Montreal" ) ;\nZonedDateTime zdt = ld.atStartOfDay( z ) ;\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\nzdt.toString(): 2014-01-07T00:00:00Z
\n
对于您想要的格式,使用预定义的格式化程序生成一个字符串DateTimeFormatter.ISO_LOCAL_DATE_TIME,然后T用空格替换中间的字符串。
String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )\n .replace( "T" , " " ) ; \nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n2014-01-07 00:00:00
\n
java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat。
Joda -Time项目现在处于维护模式,建议迁移到java.time类。
\n\n要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
\n\n从哪里获取 java.time 类?
\n\nThreeTen -Extra项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval、、、等等。YearWeekYearQuarter