我正在尝试将yyyy-MM-dd'T'HH中的日期格式化为:mm:ss.SSSz格式为yyyy-mm-dd HH:mm:ss,应该很容易但我无法获得它起作用。
必须解析的日期格式为:2012-10-01T09:45:00.000 + 02:00
现在我使用这个简单的日期格式化程序来格式化它:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz", Locale.FRANCE);
但这会产生类似于2012-10-01T09:45:00.000UTC + 00:00的输出。
我也尝试使用“yyyy-MM-dd'T'HH:mm:ss.SSSZ”作为模式和“yyyy-MM-ddHH:mm:ss”。后者以2012-10-01T09:45:00的形式返回日期,但尚未结束。
我认为将T分离出来会有点混乱并且无缘无故地创造开销,那么格式化这些日期的正确方法是什么?
为了说明我想将2012-10-01T09:45:00.000 + 02:00转换成2012-10-01 09:45:00
干杯!
答案 0 :(得分:73)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
SimpleDateFormat output = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = sdf.parse(time);
String formattedTime = output.format(d);
这很有效。你必须使用两个SimpleDateFormats,一个用于输入,一个用于输出,但它会为你提供你想要的东西。
答案 1 :(得分:8)
Gooye如果可以在你的项目中使用Joda Time,那么这段代码对我有用:
String dateStr = "2012-10-01T09:45:00.000+02:00";
String customFormat = "yyyy-MM-dd HH:mm:ss";
DateTimeFormatter dtf = ISODateTimeFormat.dateTime();
LocalDateTime parsedDate = dtf.parseLocalDateTime(dateStr);
String dateWithCustomFormat = parsedDate.toString(DateTimeFormat.forPattern(customFormat));
System.out.println(dateWithCustomFormat);
答案 2 :(得分:8)
我们有针对这个问题的新技术:Java 8及更高版本中内置的java.time框架。
您的输入字符串采用标准ISO 8601格式。默认情况下,该标准在java.time类中用于解析/生成日期时间值的文本表示。
OffsetDateTime odt = OffsetDateTime.parse( "2012-10-01T09:45:00.000+02:00" );
你的问题建议你要截断一整秒。
OffsetDateTime odtTruncatedToWholeSecond = odt.truncatedTo( ChronoUnit.SECONDS );
您似乎想要省略偏移和时区信息。预定义的格式化程序DateTimeFormatter.ISO_LOCAL_DATE_TIME
就是这样做的。
显然你想在中间使用空格而不是标准T
。你可以为此定义自己的格式化程序,但我只是做一个字符串操作来用空格替换T
。
String output = odtTruncatedToWholeSecond.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ).replace( "T" , " " );
正如对该问题的评论所暗示的那样,严格来说,您可以通过仅处理字符串而不转换为任何日期时间对象来实现目标。但是我在这里提供这个答案,假设您可能有其他业务逻辑来处理这些日期时间值。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 3 :(得分:3)
我试图格式化从JSON响应中收到的日期字符串,例如2016-03-09T04:50:00-0800到yyyy-MM-dd。所以这就是我尝试过的,它起作用并帮助我为格式化的日期字符串分配日历小部件。
String DATE_FORMAT_I = "yyyy-MM-dd'T'HH:mm:ss";
String DATE_FORMAT_O = "yyyy-MM-dd";
SimpleDateFormat formatInput = new SimpleDateFormat(DATE_FORMAT_I);
SimpleDateFormat formatOutput = new SimpleDateFormat(DATE_FORMAT_O);
Date date = formatInput.parse(member.getString("date"));
String dateString = formatOutput.format(date);
这很有用。感谢。
答案 4 :(得分:1)
如果你真的要快(不是我相信你的话):
char[] chars = sourceDate.toCharArray();
chars[10] = ' ';
String targetDate = new String(chars, 0, 19);
答案 5 :(得分:1)
我有一个案例,我将旧式 DB2 z/os 数据库时间戳(格式为:"yyyy-MM-dd'T'HH:mm:ss.SSSZ"
)转换为 SqlServer 2016 datetime2(格式为:"yyyy-MM-dd HH:mm:ss.SSS
)字段,该字段由我们的Spring/Hibernate Entity Manager 实例(在本例中为 OldRevision 表)。在Class中,我将日期定义为java.util
类型,并按照正常方式编写setter和getter。然后,在处理数据时,我处理与此问题相关的数据的代码如下所示:
OldRevision revision = new OldRevision();
String oldRevisionDateString= oldRevisionData.getString("originalRevisionDate", "");
Date oldDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZ");
oldDateFormat.parse(oldRevisionDateString);
SimpleDateFormat newDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
newDateFormat.setTimeZone(TimeZone.getTimeZone("EST"));
Date finalFormattedDate= newDateFormat.parse(newDateFormat.format(oldDateFormat));
revision.setOriginalRevisionDate(finalFormattedDate);
em.persist(revision);
处理相同情况的更简单方法是:
SimpleDateFormat newDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
newDateFormat.setTimeZone(TimeZone.getTimeZone("EST"));
revision.setOriginalRevisionDate(
newDateFormat.parse(newDateFormat.format(
new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZ")
.parse(rs.getString("originalRevisionDate", "")))));
答案 6 :(得分:0)
String dateStr = "2016-09-17T08:14:03+00:00";
String s = dateStr.replace("Z", "+00:00");
s = s.substring(0, 22) + s.substring(23);
Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(s);
Timestamp createdOn = new Timestamp(date.getTime());
mcList.setCreated_on(createdOn);
根据ISO 8601,Java 7增加了对时区描述符的支持。这可以在Java 7中使用。