วิธีรับ TimeZone จากมือถือ Android


140

ฉันต้องการรับเขตเวลาจากมือถือ Android เมื่อคลิกปุ่ม


11
TimeZone tz = TimeZone.getDefault (); สตริง gmt1 = TimeZone.getTimeZone (tz.getID ()). getDisplayName (false, TimeZone.SHORT); สตริง gmt2 = TimeZone.getTimeZone (tz.getID ()). getDisplayName (false, TimeZone.LONG); Log.d ("แท็ก", "เขตเวลา:" + gmt1 + "\ t" + gmt2); และนี่คือรหัส
asha v

10
ฉันจะไม่คร่ำครวญกับ asha v. ฉันแค่มองหาสิ่งเดียวกันและคำตอบที่ฉันพบแตกต่างจากสิ่งเหล่านี้ การค้นหาโดย "TimeZone.getDefault" ที่แน่นอนทำให้ฉันอยู่ที่นี่
Yar

คำตอบ:


189

คุณเคยลองใช้TimeZone.getDefault():

แอปพลิเคชั่นส่วนใหญ่จะใช้TimeZone.getDefault ()ซึ่งคืนค่า TimeZone ตามโซนเวลาที่โปรแกรมกำลังทำงาน

Ref: http://developer.android.com/reference/java/util/TimeZone.html


22
หากคุณใช้JodaTimeคุณสามารถรับ DateTimeZone ได้ดังต่อไปนี้:DateTimeZone.forTimeZone(TimeZone.getDefault());
Joshua Pinter

@JoshPinter ฉันใช้แพคเกจอันไหนบน android.icu.utils หรือ java.util
Neon Warge

1
ฉันเปลี่ยนเขตเวลาจากอุปกรณ์เป็น CST ไม่ใช่การให้ CST ฉันกลับมา มีวิธีรับโซนเวลาของอุปกรณ์หรือไม่
Abhinav Saxena

ฉันสงสัยว่า TimeZone.getDefault จะได้รับผลกระทบหรือไม่หากเราปลอมเขตเวลาของอุปกรณ์ ดูเหมือนว่าจะไม่ได้อยู่ในการจำลอง Android
Hau Luu

@NeonWarge ทั้งสองจะใช้งานได้แม้ว่า android.icu จะใช้งานได้กับ API 24 ขึ้นไปเท่านั้น
Nicolas

136
TimeZone tz = TimeZone.getDefault();
System.out.println("TimeZone   "+tz.getDisplayName(false, TimeZone.SHORT)+" Timezon id :: " +tz.getID());

เอาท์พุท:

TimeZone GMT + 09: 30 Timezon id :: ออสเตรเลีย / ดาร์วิน


@Flexo วิธีรับการประทับเวลาจากอุปกรณ์ Android
KOUSIK daniel

4
คำอธิบายที่ยอดเยี่ยมเกี่ยวกับผลลัพธ์
Anand Savjani


14

ผมจำเป็นต้องมีการชดเชยเวลาที่ไม่เพียง แต่รวมวันเงินฝากออมทรัพย์แสง แต่เป็นnumerial นี่คือรหัสที่ฉันใช้ในกรณีที่มีคนมองหาตัวอย่าง

ฉันได้รับคำตอบของ"3.5" (3:30 ')ซึ่งเป็นสิ่งที่ฉันคาดหวังในเตหะรานอิหร่านในฤดูหนาวและ"4.5" (4:30')สำหรับฤดูร้อน

ฉันต้องการมันเป็นสายอักขระด้วยดังนั้นฉันจึงสามารถโพสต์ลงในเซิร์ฟเวอร์ได้ดังนั้นคุณอาจไม่ต้องการบรรทัดสุดท้าย

สำหรับการแก้ไขเขตเวลา:

TimeZone tz = TimeZone.getDefault();
Date now = new Date();
//Import part : x.0 for double number
double offsetFromUtc = tz.getOffset(now.getTime()) / 3600000.0;
String m2tTimeZoneIs = Double.parseDouble(offsetFromUtc);

1
มันใช้งานได้สำหรับฉันเมื่อฉันเพิ่งจะจัดการกับระยะเวลา (เป็นนาฬิกาจับเวลา)
Ahsan

13

ลองรหัสนี้ -

Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();

มันจะกลับเขตเวลาที่ผู้ใช้เลือก


4
การสร้างCalendarวัตถุสำหรับสิ่งนี้เป็นเรื่องไร้สาระ การสร้างวัตถุประเภทนี้มีราคาแพง TimeZone.getDefault()เป็นวิธีที่เหมาะสมในการรับสิ่งนี้
ไม่ระบุชื่อ

3
@KrLx_roller กรุณาตรวจสอบอย่างรอบคอบก่อนที่จะตอบ downvoting ฉันได้เขียนคำตอบของฉันแล้วให้ผู้ใช้เลือกเขตเวลาในขณะที่ TimeZone.getDefault () จะคืนค่าเขตเวลาเริ่มต้นการติดตั้ง สำหรับข้อมูลเพิ่มเติมกรุณาcode.google.com/p/android/issues/detail?id=2037
anujprashar

รหัสของคุณจะคืนค่าเขตเวลาเดียวกับ TimeZone.getDefault () สำหรับ android 4.2 TimeZone.getDefault () จะคืนค่าเขตเวลาที่เลือกในการตั้งค่า -> วันที่และเวลา
user1088166


3

โซลูชันที่ง่ายที่สุดด้วยรูปแบบวันที่ที่เรียบง่าย: SimpleDateFormat ("ZZZZZ"):

 Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
                Locale.getDefault());
        Date currentLocalTime = calendar.getTime();

        DateFormat date = new SimpleDateFormat("ZZZZZ",Locale.getDefault());
        String localTime = date.format(currentLocalTime);
        System.out.println(localTime+ "  TimeZone   " );

==> เอาต์พุตคือ: +05: 30



2

ZoneId จาก java.time และ ThreeTenABP

คำตอบที่ทันสมัย:

    ZoneId zone = ZoneId.systemDefault();
    System.out.println(zone);

เมื่อฉันรันข้อมูลโค้ดนี้ในเขตเวลาของออสเตรเลีย / ซิดนีย์ผลลัพธ์ที่ได้คือ:

Australia/Sydney

ถ้าคุณต้องการชื่อโซนเวลาหรือฤดูร้อน (DST) ที่ทราบเวลา:

    DateTimeFormatter longTimeZoneFormatter = DateTimeFormatter.ofPattern("zzzz", Locale.getDefault());
    String longTz = ZonedDateTime.now(zone).format(longTimeZoneFormatter);
    System.out.println(longTz);

    DateTimeFormatter shortTimeZoneFormatter = DateTimeFormatter.ofPattern("zzz", Locale.getDefault());
    String shortTz = ZonedDateTime.now(zone).format(shortTimeZoneFormatter);
    System.out.println(shortTz);
Eastern Summer Time (New South Wales)
EST

TimeZoneระดับใช้ในส่วนของคำตอบอื่น ๆ คือสิ่งที่เราได้เมื่อคำถามที่ถูกถามในปี 2011 แม้ว่าจะได้รับการออกแบบมาไม่ดี วันนี้มันล้าสมัยไปแล้วและผมขอแนะนำให้เราใช้ java.time แทน API วันที่และเวลาของ Java สมัยใหม่ที่ออกมาในปี 2014

คำถาม: java.time ไม่จำเป็นต้องใช้ Android API ระดับ 26 ใช่ไหม

java.time ทำงานได้ดีบนอุปกรณ์ Android ที่เก่ากว่าและใหม่กว่า มันก็ต้องมีอย่างน้อยJava 6

  • ใน Java 8 และใหม่กว่าและบนอุปกรณ์ Android รุ่นใหม่ (จาก API ระดับ 26) API ที่ทันสมัยนั้นมีมาให้ในตัว
  • ในที่ไม่ใช่ Android Java 6 และ 7 จะได้รับ ThreeTen Backport ซึ่งเป็น backport ของคลาสที่ทันสมัย ​​(ThreeTen สำหรับ JSR 310 ดูลิงค์ที่ด้านล่าง)
  • บน (เก่า) Android ใช้ Android รุ่น ThreeTen Backport มันเรียกว่า ThreeTenABP และตรวจสอบให้แน่ใจว่าคุณได้อิมพอร์ตคลาสวันที่และเวลาจากorg.threeten.bpด้วยแพ็คเกจย่อย

การเชื่อมโยง


1

สำหรับอุปกรณ์ที่มี API 26 ขึ้นไปคุณจะได้รับสิ่งนี้:

ZonedDateTime.now().getZone().toString();

1

บนอุปกรณ์ของฉันTimeZone.getDefault()กลับมาเสมอโซนเวลา UTC

ฉันต้องทำสิ่งนี้เพื่อให้ได้เขตเวลาที่ผู้ใช้กำหนด:

TimeZone.setDefault(null)
val tz = TimeZone.getDefault()

มันจะกลับเขตเวลาที่ผู้ใช้เลือก


0

คำตอบทั้งหมดที่นี่ดูเหมือนจะแนะนำให้ตั้งค่าพารามิเตอร์ daylite เป็น เป็นเท็จเท็จสิ่งนี้ไม่ถูกต้องสำหรับเขตเวลาจำนวนมากที่เปลี่ยนชื่อตัวย่อโดยขึ้นอยู่กับช่วงเวลาของปี (เช่น EST กับ EDT)

การแก้ปัญหาด้านล่างจะให้ตัวย่อที่ถูกต้องตามวันที่ปัจจุบันของเขตเวลา

val tz = TimeZone.getDefault()
val isDaylite = tz.inDaylightTime(Date())
val timezone = tz.getDisplayName(isDaylite, TimeZone.SHORT)

TimeZoneชั้นถูกออกแบบมาไม่ดีและล้าสมัยยาว
Ole VV
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.