簡體   English   中英

將UTC日期轉換為當前時區

[英]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

tl; dr

LocalDateTime.parse( "2016-09-25 17:26:12".replace( " " , "T" ) )
             .atZoneSameInstant( ZoneId.systemDefault() )
             .format( DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ) )

避免使用舊的日期時間類

您正在使用與最早的Java版本捆綁在一起的麻煩的舊日期時間類。 現在由java.time類取代。

ISO 8601

您輸入的字符串幾乎符合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指定長度或縮寫( FULLLONGMEDIUMSHORT )。

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.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊日期時間類,例如java.util.Date.Calendarjava.text.SimpleDateFormat

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

要了解更多信息,請參見Oracle教程 並在Stack Overflow中搜索許多示例和說明。

大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,並進一步適應的AndroidThreeTenABP (見如何使用...... )。

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

您可以使用 :

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

如果看到,它將時區信息附加到日期。 如果您不想打印它,則可以使用SimpleDateFormatDate轉換為字符串,例如:

SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
System.out.println(format.format(new Date()));

暫無
暫無

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

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