[英]Convert UTC date to current timezone
我必須將格式為“ 2016-09-25 17:26:12”的UTC日期轉換為Android的當前時區。 我這樣做:
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date myDate = simpleDateFormat.parse(temp.getString("date"));
System.out.println(mydate.toString());
這行得通,但我不知道為什么還要打印“ GMT + 02:00”。 這是輸出:“ Sun Sep 25 19:26:12 GMT + 02:00 2016”,我不想顯示“ GMT + 02:00”。
編輯,解決方案代碼:
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
SimpleDateFormat outputSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date myDate = simpleDateFormat.parse(temp.getString("date"));
System.out.println(outputSdf.format(myDate));
它會打印GMT + 02,因為這是您的“本地”時區。 如果要打印不帶時區信息的日期,請使用SimpleDateFormat設置日期格式。
編輯:添加代碼示例(帶有變量“ myDate”)
SimpleDateFormat inputSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
inputSDF.setTimeZone(TimeZone.getTimeZone("UTC"));
Date myDate = inputSDF.parse("2016-09-25 17:26:12");
//
SimpleDateFormat outputSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(outputSDF.format(myDate));
System.out.println(TimeZone.getDefault().getID());
(在我的)控制台上的收益(使用我的本地時區)。
2016-09-25 19:26:12
Europe/Paris
LocalDateTime.parse( "2016-09-25 17:26:12".replace( " " , "T" ) )
.atZoneSameInstant( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ) )
您正在使用與最早的Java版本捆綁在一起的麻煩的舊日期時間類。 現在由java.time類取代。
您輸入的字符串幾乎符合java.time類默認使用的標准ISO 8601格式。 用T
代替中間的空格。
String input = "2016-09-25 17:26:12".replace( " " , "T" );
LocalDateTime
輸入缺少從UTC或時區 偏移的任何指示。 因此,我們將其解析為LocalDateTime
。
LocalDateTime ldt = LocalDateTime.parse( input );
OffsetDateTime
您聲稱從您的應用程序上下文知道該日期時間值旨在為UTC 。 因此,我們將該偏移量分配為常量ZoneOffset.UTC
成為OffsetDateTime
。
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC );
ZonedDateTime
您還說過要將此值調整為用戶JVM(在本例中為Android運行時)的當前默認時區。 知道此默認值可以在應用執行期間隨時更改。 如果時區很關鍵,則應明確要求用戶提供所需/期望的時區。 ZoneId
類表示時區。
ZoneId z = ZoneId.systemDefault(); // Or, for example: ZoneId.of( "America/Montreal" )
ZonedDateTime zdt = odt.atZoneSameInstant( z );
您說要生成一個字符串來表示此日期時間值。 您可以指定所需的任何格式。 但是通常最好讓java.time根據Locale
對象中定義的人類語言和文化規范為您自動本地化。 使用FormatStyle
指定長度或縮寫( FULL
, LONG
, MEDIUM
, SHORT
)。
Locale locale = Locale.getDefault(); // Or, for example: Locale.CANADA_FRENCH
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( locale );
String output = zdt.format( f );
java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊日期時間類,例如java.util.Date
, .Calendar
和java.text.SimpleDateFormat
。
現在處於維護模式的Joda-Time項目建議遷移到java.time。
要了解更多信息,請參見Oracle教程 。 並在Stack Overflow中搜索許多示例和說明。
大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,並進一步適應的Android在ThreeTenABP (見如何使用...... )。
ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多 。
您可以使用 :
system.out.println(myDate.getDay()+" "+myDate.getMonth()+" "+myDate.getYear());
把你需要的
您可以使用設置時區方法來實現。
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date myDate = simpleDateFormat.parse(rawQuestion.getString("AskDateTime"));
下面是Date
類的toString()
實現:
public String toString() {
// "EEE MMM dd HH:mm:ss zzz yyyy";
BaseCalendar.Date date = normalize();
StringBuilder sb = new StringBuilder(28);
int index = date.getDayOfWeek();
if (index == BaseCalendar.SUNDAY) {
index = 8;
}
convertToAbbr(sb, wtb[index]).append(' '); // EEE
convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' '); // MMM
CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd
CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':'); // HH
CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
TimeZone zi = date.getZone();
if (zi != null) {
sb.append(zi.getDisplayName(date.isDaylightTime(), TimeZone.SHORT, Locale.US)); // zzz
} else {
sb.append("GMT");
}
sb.append(' ').append(date.getYear()); // yyyy
return sb.toString();
}
如果看到,它將時區信息附加到日期。 如果您不想打印它,則可以使用SimpleDateFormat
將Date
轉換為字符串,例如:
SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
System.out.println(format.format(new Date()));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.