web-dev-qa-db-ja.com

UTCを現在のロケール時刻に変換します

WebサービスからいくつかのJSONデータをダウンロードしています。このJSONには、いくつかの日付/時刻値があります。 UTCのすべて。結果の日付オブジェクトが現在のロケールにあるように、この日付文字列を解析するにはどうすればよいですか?

たとえば、サーバーから「2011-05-18 16:35:01」が返され、デバイスに「2011-05-18 18:35:01」と表示されるはずです(GMT +2)

私の現在のコード:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date myDate = simpleDateFormat.parse(rawQuestion.getString("AskDateTime"));
36
LongFlick

設定されたタイムゾーンメソッドがあります。

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date myDate = simpleDateFormat.parse(rawQuestion.getString("AskDateTime"));

出来た!

88
Affe

したがって、UTCタイムゾーンをSimpleDateFormatに通知する必要があります。

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
TimeZone utcZone = TimeZone.getTimeZone("UTC");
simpleDateFormat.setTimeZone(utcZone);
Date myDate = simpleDateFormat.parse(rawQuestion.getString("AskDateTime"));

表示する:

simpleDateFormat.setTimeZone(TimeZone.getDefault());
String formattedDate = simpleDateFormat.format(myDate);
18
Paweł Dyda

Java.time

現代の答えに貢献したいと思います。他の回答のほとんどは正解であり、2011年には正解でした。今日のSimpleDateFormatは古くなっており、常にいくつかの驚きがありました。そして今日、はるかに優れたものがあります:_Java.time_はJSR-310とも呼ばれ、最新のJava日時APIです。この回答は、外部依存関係を受け入れるか(Java.time_がAndroidデバイスに到達するまで)、または既にJava 8以降を使用しているユーザー向けです。

_    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    String dateTimeFromServer = "2011-05-18 16:35:01";
    String localTimeToDisplay = LocalDateTime.parse(dateTimeFromServer, formatter)
            .atOffset(ZoneOffset.UTC)
            .atZoneSameInstant(ZoneId.of("Europe/Zurich"))
            .format(formatter);
_

このコードスニペットの結果は、求められたものです。

_2011-05-18 18:35:01
_

可能であれば明示的なタイムゾーンを与えてください

ヨーロッパ/チューリッヒのタイムゾーンを明示的に指定しました。ご希望のローカルタイムゾーンに置き換えてください。デバイスのタイムゾーン設定に依存するには、ZoneId.systemDefault()を使用します。ただし、これはJVMからタイムゾーン設定を取得するため脆弱であり、プログラムの別の部分または同じJVMで実行されている他のプログラムによって設定が変更される可能性があることに注意してください。

AndroidでJava.timeを使用する

外部依存関係を約束しました。 Androidで上記を使用するには、ThreeTenABP、ThreeTen BackportのAndroidエディション、JSR-310のJava 6および7へのバックポートが必要です。 この質問:AndroidプロジェクトでThreeTenABPを使用する方法 で徹底的に説明されています。

2
Ole V.V.
public static String toLocalDateString(String utcTimeStamp) {
    Date utcDate = new Date(utcTimeStamp);
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
    df.setTimeZone(TimeZone.getTimeZone("PST"));
    return df.format(utcDate);
}

乾杯!

2
dheeran

あなたの文字列myUTC = "2016-02-03T06:41:33.000Z"

SimpleDateFormat existingUTCFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
SimpleDateFormat requiredFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

try{
Date getDate = existingFormat.parse(myUTC);
String mydate = requiredFormat.format(getDate)
}
catch(ParseException){
}
2
Raja Jawahar

代わりに(UTC時間の)入力としてタイムスタンプ(Long)があった場合、これはAndroid上にあるので、次のようなことができます:

fun DateFormat.formatUtcEpochSecond(epochSecond: Long): String = format(CalendarEx.getFromEpochSecond(epochSecond).time)

fun DateFormat.formatUtcEpochMs(epochMilli: Long): String = format(CalendarEx.getFromEpochMilli(epochMilli).time)

CalendarEx.kt

object CalendarEx {

    @JvmStatic
    fun getFromEpochMilli(epochMilli: Long): Calendar {
        val cal = Calendar.getInstance()
        cal.timeInMillis = epochMilli
        return cal
    }

    @JvmStatic
    fun getFromEpochSecond(epochSecond: Long): Calendar {
        val cal = Calendar.getInstance()
        cal.timeInMillis = epochSecond * 1000L
        return cal
    }
}

DateHelper.kt

/**
 * gets the default date formatter of the device
 */
@JvmStatic
fun getFormatDateUsingDeviceSettings(context: Context): Java.text.DateFormat {
    return DateFormat.getDateFormat(context) ?: SimpleDateFormat("yyyy/MM/dd", Locale.getDefault())
}

/**
 * gets the default time formatter of the device
 */
@JvmStatic
fun getFormatTimeUsingDeviceSettings(context: Context): Java.text.DateFormat {
    return DateFormat.getTimeFormat(context) ?: SimpleDateFormat("HH:mm", Locale.getDefault())
}

使用例:

    val dateFormat = DateHelper.getFormatDateUsingDeviceSettings(this)
    val timeFormat = DateHelper.getFormatTimeUsingDeviceSettings(this)
    val timeStampSecondsInUtc = 1516797000L
    val localDateTime = Instant.ofEpochSecond(timeStampSecondsInUtc).atZone(ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0))).toLocalDateTime()
    Log.d("AppLog", "input time in UTC:" + localDateTime)
    Log.d("AppLog", "formatted date and time in current config:${dateFormat.formatUtcEpochSecond(timeStampSecondsInUtc)} ${timeFormat.formatUtcEpochSecond(timeStampSecondsInUtc)}")
0

Dateオブジェクトは、常にUTCのエポック0以降のミリ秒の周りのラッパーです。現地時間を表すことはありません。

つまり、ローカル時間の表示文字列を作成する2つ目のSimpleDateFormatterを作成する必要があります。

編集:@Op。 Androidでの日付/時刻形式の優先クラスは Java.text.DateFormat

0
Kaj