簡體   English   中英

Java 格式 yyyy-MM-dd'T'HH:mm:ss.SSSz 到 yyyy-mm-dd HH:mm:ss

[英]Java format yyyy-MM-dd'T'HH:mm:ss.SSSz to yyyy-mm-dd HH:mm:ss

我正在嘗試將 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 close 的形式返回日期,但還沒有。

我認為將 T 子串起來會有點混亂並且無緣無故地產生開銷,因此格式化這些日期的正確方法是什么?

為了說明我想將 2012-10-01T09:45:00.000+02:00 轉換為 2012-10-01 09:45:00

干杯!

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,一個用於輸入,一個用於輸出,但它會給你你想要的。

時間

我們有解決這個問題的新技術: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 中的日期時間類型表,現代和傳統


關於java.time

java.time框架內置於 Java 8 及更高版本中。 這些類取代麻煩的老傳統日期時間類,如java.util.DateCalendar ,和SimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參閱Oracle 教程 並在 Stack Overflow 上搜索許多示例和解釋。 規范是JSR 310

您可以直接與您的數據庫交換java.time對象。 使用符合JDBC 4.2或更高版本的JDBC 驅動程序 不需要字符串,不需要java.sql.*類。

從哪里獲得 java.time 類?

哪個 java.time 庫與哪個版本的 Java 或 Android 一起使用的表

ThreeTen-Extra項目用額外的類擴展了 java.time。 該項目是未來可能添加到 java.time 的試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

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);

我試圖將從 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);

這奏效了。 謝謝。

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);

Java 7 根據 ISO 8601 添加了對時區描​​述符的支持。這可以在 Java 7 中使用。

如果你真的要快(不是我相信你做的):

char[] chars = sourceDate.toCharArray();
chars[10] = ' ';
String targetDate = new String(chars, 0, 19);

我有一個案例,我將舊式 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 Table)處理。在 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", "")))));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM