web-dev-qa-db-ja.com

AndroidでUTCを現地時間に変換する

私のプロジェクトでは、json形式でAPI応答を取得しています。このJul 16, 2013 12:08:59 AMのようなUTC時間形式の時間の文字列値を取得します。
これを現地時間に変更する必要があります。これは、アプリが現地時間を表示するために必要な場所です。これを行う方法

ここに私が試したコードがあります:

String aDate = getValue("dateTime", aEventJson);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z");
simpleDateFormat.setTimeZone(TimeZone.getDefault());
String formattedDate = simpleDateFormat.format(aDate);

ADateにJul 16, 2013 12:08:59 AMが含まれているとします

37
MadTech

これが私の試みです。

String dateStr = "Jul 16, 2013 12:08:59 AM";
SimpleDateFormat df = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a", Locale.ENGLISH);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = df.parse(dateStr);
df.setTimeZone(TimeZone.getDefault());
String formattedDate = df.format(date);

Am/pmマーカーの「a」にも注意してください...

71
devconsole

現代の答えに貢献したいと思います。 SimpleDateFormatは2013年に日付と時刻を解析およびフォーマットするためのクラス(Joda-Timeを除く)でしたが、現在では古くなっており、_Java.time_またはJSR- 310、2014年にJava 8で登場した最新のJava日時API。

しかし、ほとんどのAndroidデバイスはまだJava 8を実行しません。幸い、JSR-310のJava Android 7.へのバックポートであるThreeTenABPを通じて、最新のJava日時APIを引き続き使用できます。詳細は この質問:Android ProjectでThreeTenABPを使用する方法

コードは次のとおりです。

_    DateTimeFormatter formatter 
            = DateTimeFormatter.ofPattern("MMM dd, uuuu hh:mm:ss a", Locale.ENGLISH);
    String aDate = "Jul 16, 2013 12:08:59 AM";
    String formattedDate = LocalDateTime.parse(aDate, formatter)
            .atOffset(ZoneOffset.UTC)
            .atZoneSameInstant(ZoneId.systemDefault())
            .format(formatter);
    System.out.println(formattedDate);
_

私のコンピューターはヨーロッパ/コペンハーゲンのタイムゾーンを実行しているため、7月はUTCより2時間早いため、

_Jul 16, 2013 02:08:59 AM
_

その他のポイント:

  • 文字列にAMがあるため、時間は1〜12のAM内であると想定しました。正しく解析してフォーマットするには、フォーマットパターン文字列に小文字のhが必要です。大文字のHは、0〜23の時間帯を表します。
  • フォーマッターにSimpleDateFormatまたはDateTimeFormatterのいずれかで明示的なロケールを指定することをお勧めします。ロケールが指定されていない場合、フォーマッタはデバイスのデフォルトのロケールを使用します。 「Jul」と「AM」は英語です。コードが多くのデバイスでうまく動作するのは、ある日、英語以外のロケールでクラッシュするデバイスで実行されるまでです。
  • 可能であれば、ZoneId.of("Asia/Kolkata")のように、目的のタイムゾーンを明示的に指定します。 JVMのデフォルトのタイムゾーンは、プログラムの他の部分または同じJVMで実行されている他のプログラムによって変更される可能性があるため、信頼できません。
8
Ole V.V.
//your UTC time var
long time = UTCtime;

//convert it
Time timeFormat = new Time();
timeFormat.set(time+TimeZone.getDefault().getOffset(time));

//use the value
long localTime = timeFormat.toMillis(true);
3
Tom Brinkkemper

1.UTCコンバーターへのローカル

public static String localToUTC(String dateFormat, String datesToConvert) {


        String dateToReturn = datesToConvert;

        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        sdf.setTimeZone(TimeZone.getDefault());
        Date gmt = null;

        SimpleDateFormat sdfOutPutToSend = new SimpleDateFormat(dateFormat);
        sdfOutPutToSend.setTimeZone(TimeZone.getTimeZone("UTC"));

        try {

            gmt = sdf.parse(datesToConvert);
            dateToReturn = sdfOutPutToSend.format(gmt);

        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dateToReturn;
    }

2。UTCからローカルコンバーター

public static String uTCToLocal(String dateFormatInPut, String dateFomratOutPut, String datesToConvert) {


    String dateToReturn = datesToConvert;

    SimpleDateFormat sdf = new SimpleDateFormat(dateFormatInPut);
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

    Date gmt = null;

    SimpleDateFormat sdfOutPutToSend = new SimpleDateFormat(dateFomratOutPut);
    sdfOutPutToSend.setTimeZone(TimeZone.getDefault());

    try {

        gmt = sdf.parse(datesToConvert);
        dateToReturn = sdfOutPutToSend.format(gmt);

    } catch (ParseException e) {
        e.printStackTrace();
    }
    return dateToReturn; }
2
Ronak Gadhia

次のコードを使用します。

TimeZone defaultTimeZone = TimeZone.getDefault();
String strDefaultTimeZone = defaultTimeZone.getDisplayName(false, TimeZone.SHORT);

//Your Code
String aDate = getValue("dateTime", aEventJson);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone(strDefaultTimeZone));
String formattedDate = simpleDateFormat.format(aDate);

これは動作するはずです。

1
Salman Khakwani