web-dev-qa-db-ja.com

指定されたタイムゾーンの現在の時刻を取得します:android

私はAndroid=を初めて使用し、現在、タイムゾーンを指定して現在の時刻を取得するという問題に直面しています。

"GMT-7"、つまり文字列の形式でタイムゾーンを取得します。システム時間があります。

上記の指定されたタイムゾーンで現在の時刻を取得するクリーンな方法はありますか?どんな助けでもありがたいです。おかげで、

編集:これをやろうとしている:

public String getTime(String timezone) {
    Calendar c = Calendar.getInstance();
    c.setTimeZone(TimeZone.getTimeZone(timezone));
    Date date = c.getTime();
    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    String strDate = df.format(date);
    return c.getTime().toString();
}
19
Vishesh Joshi

私はそれをこのように機能させることができました:

TimeZone tz = TimeZone.getTimeZone("GMT+05:30");
Calendar c = Calendar.getInstance(tz);
String time = String.format("%02d" , c.get(Calendar.HOUR_OF_DAY))+":"+
            String.format("%02d" , c.get(Calendar.MINUTE))+":"+
.                   String.format("%02d" , c.get(Calendar.SECOND))+":"+
    .           String.format("%03d" , c.get(Calendar.MILLISECOND));
21
Vishesh Joshi

Java.time

Javaにバンドルされている古い日時クラスとサードパーティのJoda-Timeライブラリの両方が、Javaに組み込まれた Java.time フレームワークに取って代わられました8以降。これらのクラスは、Java.util.Dateなどの古い厄介な日時クラスに取って代わります。 Oracleチュートリアル を参照してください。 Java.time機能の多くはJava 6&7で ThreeTen-Backport にバックポートされ、さらにAndroidで ThreeTenABP

ちなみに、-7などの時間の1桁で offset-from-UTC を参照しないでください。これは非標準であり、さまざまなプロトコルやライブラリと互換性がありません。 -07のように、常に2桁目をゼロで埋めます。

タイムゾーンではなくオフセットだけが必要な場合は、OffsetDateTimeクラスを使用します。

ZoneOffset offset = ZoneOffset.ofHours( -7 );
OffsetDateTime odt = OffsetDateTime.now( offset );
String output1 = odt.toLocalTime().toString();
System.out.println( "Current time in " + offset + ": " + output1 );

-07:00の現在の時刻:19:41:36.525

オフセットプラスである完全なタイムゾーンがある場合、夏時間(DST)などの異常を処理するための一連のルールではなく、単なるUTCからのオフセット、ZonedDateTimeクラスを使用します。

ZoneId denverTimeZone = ZoneId.of( "America/Denver" );
ZonedDateTime zdt = ZonedDateTime.now( denverTimeZone );
String output2 = zdt.toLocalTime().toString();
System.out.println( "Current time in " + denverTimeZone + ": " + output2 );

アメリカ/デンバーの現在の時刻:20:41:36.560

このコードはIdeone.comで動作しています を参照してください。

ジョーダタイム

Androidでは Joda-Time 2.7を使用できます。日時の作業がはるかに簡単になります。

DateTimeZone zone = DateTimeZone.forID ( "America/Denver" );
DateTime dateTime = new DateTime ( zone );
String output = dateTime.toLocalTime ().toString ();

コンソールにダンプします。

System.out.println ( "zone: " + zone + " | dateTime: " + dateTime + " | output: " + output );

実行すると…

ゾーン:アメリカ/デンバー| dateTime:2016-07-11T20:50:17.668-06:00 |出力:20:50:17.668

エポック以降のカウント

私は強くお勧めします count-since - Epoch による時間による追跡。ただし、必要に応じて、 getMillis メソッドを呼び出して、Joda-Timeの内部ミリ秒-以来のエポック( nix時間 、1970 UTCの最初の瞬間)を抽出できます。 DateTime .

32ビットのlongではなく、64ビットのintを使用していることに注意してください primitive types

Java.timeで。 Java.timeは最大でナノ秒の分解能を保持するため、ここでデータを失う可能性があることに注意してください。ナノ秒からミリ秒に移行するということは、1秒の小数の最大6桁を切り捨てることを意味します(ミリ秒の場合は3桁、ナノ秒の場合は9桁)。

long millis = Instant.now ().toEpochMilli ();

ジョーダタイム。

long millis = DateTime.now( denverTimeZone ).getMillis();
12
Basil Bourque
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
Log.d("Time zone","="+tz.getDisplayName());
11
aran

これを試して:

SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
df.setTimeZone(TimeZone.getTimeZone("YOUR_TIMEZONE"));
String strDate = df.format(date);

YOUR_TIMEZONEは、GMT、UTC、GMT-5などのようになります。

7
Flávio Faria

タイムゾーンをカレンダーではなくフォーマッターに設定します。

public String getTime(String timezone) {
    Calendar c = Calendar.getInstance();
    Date date = c.getTime(); //current date and time in UTC
    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    df.setTimeZone(TimeZone.getTimeZone(timezone)); //format in given timezone
    String strDate = df.format(date);
    return strDate;
}
5
igork

はい、できます。 TimeZone setDefault()メソッドを呼び出す。

public String getTime(String timezone) {
    TimeZone defaultTz = TimeZone.getDefault();

    TimeZone.setDefault(TimeZone.getTimeZone(timezone));
    Calendar cal = Calendar.getInstance();
    Date date = cal.getTime();
    String strDate = date.toString();

    // Reset Back to System Default
    TimeZone.setDefault(defaultTz);

    return strDate;
}
3
Tang Chanrith

私はもっ​​と簡単な方法を見つけました。

最初に使用するアプリのタイムゾーン

    TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));

そしてCalanderを呼び出して内部で日付を取得します。これは、上記で設定されたデフォルトのタイムゾーンをアプリ全体で使用します。

     Calendar cal = Calendar.getInstance();
     Log.d("Los angeles time   ",cal.getTime().toString());

タイムゾーンに基づいて現在の時刻が表示されます。

D/Los angeles time:Thu Jun 21 13:52:25 PDT 2018

2
Justcurious
 TimeZone tz = TimeZone.getTimeZone(TimeZoneID);
 Calendar c= Calendar.getInstance(tz);
 String time=new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date(cal.getTimeInMillis()));

TimeZoneIDは、選択に応じて、以下のいずれかになります。

String[] ids=TimeZone.getAvailableIDs();

その後、上記の受け入れられた回答に従って時間を取得できます

String time = String.format("%02d" , c.get(Calendar.HOUR_OF_DAY))+":"+
            String.format("%02d" , c.get(Calendar.MINUTE))+":"+
                  String.format("%02d" , c.get(Calendar.SECOND))+":"+
               String.format("%03d" , c.get(Calendar.MILLISECOND));
1
Rajesh Nasit

最もクリーンな方法はSimpleDateFormatを使用することです

SimpleDateFormat = SimpleDateFormat("MMM\nd\nh:mm a", Locale.getDefault())

または、ロケールを指定できます

0
Kyle

タイムゾーンとミリ秒の値を処理する1つの方法:

val currentDateTime = Calendar.getInstance().apply {
        timeZone?.let {
            val tzCalendar = Calendar.getInstance(it)
            this.set(Calendar.HOUR_OF_DAY, tzCalendar.get(Calendar.HOUR_OF_DAY))
            this.set(Calendar.MINUTE, tzCalendar.get(Calendar.MINUTE))
        }
    }.time

このようにして、特定のタイムゾーンの時間をミリ秒単位で取得します。

0
Goran Devs