Làm thế nào để có được TimeZone từ điện thoại di động Android?


139

Tôi muốn lấy múi giờ từ điện thoại di động Android khi nhấp vào nút.


11
TimeZone tz = TimeZone.getDefault (); Chuỗi gmt1 = TimeZone.getTimeZone (tz.getID ()). GetDisplayName (false, TimeZone.SHORT); Chuỗi gmt2 = TimeZone.getTimeZone (tz.getID ()). GetDisplayName (false, TimeZone.LONG); Log.d ("Thẻ", "TimeZone:" + gmt1 + "\ t" + gmt2); Và đây là mã
asha v

10
Tôi sẽ không quá thô lỗ với asha v. Tôi chỉ tìm kiếm điều tương tự và câu trả lời tôi tìm thấy khác với những câu hỏi này. Trên thực tế, việc tìm kiếm theo "TimeZone.getDefault" chính xác đã dẫn tôi đến đây.
Yar

Câu trả lời:


189

Bạn đã thử sử dụng TimeZone.getDefault():

Hầu hết các ứng dụng sẽ sử dụng TimeZone.getDefault () trả về TimeZone dựa trên múi giờ nơi chương trình đang chạy.

Tham chiếu: http://developer.android.com/reference/java/util/TimeZone.html


22
Nếu bạn đang sử dụng JodaTime , bạn có thể nhận được DateTimeZone với các mục sau:DateTimeZone.forTimeZone(TimeZone.getDefault());
Joshua Pinter

@JoshPinter tôi sử dụng gói nào, gói nào trên android.icu.utils hoặc java.util?
Chiến tranh neon

1
Tôi đã thay đổi múi giờ từ thiết bị sang CST, nó không trả lại cho tôi. Có cách nào để có được múi giờ, của thiết bị không?
Abhinav Saxena

Tôi tự hỏi, liệu TimeZone.getDefault có bị ảnh hưởng nếu chúng ta bằng cách nào đó giả mạo múi giờ của thiết bị. Nó dường như không có trên trình giả lập Android.
Hậu Lưu

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

Đầu ra:

TimeZone GMT + 09: 30 Timezon id :: Úc / Darwin


@Flexo làm cách nào để lấy dấu thời gian từ thiết bị Android
KOUSIK daniel 7/07/2015

4
giải thích tuyệt vời với đầu ra
Anand Savigate


14

Tôi cần sự bù đắp không chỉ bao gồm thời gian tiết kiệm ánh sáng ban ngày mà còn như một con số . Đây là mã mà tôi đã sử dụng trong trường hợp ai đó đang tìm kiếm một ví dụ.

Tôi nhận được phản hồi là "3,5" (3:30 ') , đó là những gì tôi mong đợi ở Tehran, Iran vào mùa đông và "4,5" (4:30') cho mùa hè.

Tôi cũng cần nó như một chuỗi để tôi có thể đăng nó lên máy chủ để bạn có thể không cần dòng cuối cùng.

để có được múi giờ hiện tại:

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
Nó làm việc cho tôi khi tôi chỉ đang xử lý thời lượng (như một chiếc đồng hồ bấm giờ).
Ahsan

13

Hãy thử mã này-

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

Nó sẽ trả về múi giờ người dùng đã chọn.


4
Tạo một Calendarđối tượng cho điều này là vô nghĩa. Việc tạo ra loại đối tượng này là đắt tiền. TimeZone.getDefault()là cách thích hợp để có được điều này.
ẩn danh

3
@KrLx_ler Vui lòng kiểm tra cẩn thận trước khi trả lời. Tôi đã viết câu trả lời của mình trả về múi giờ đã chọn của người dùng trong khi TimeZone.getDefault () sẽ trả về múi giờ mặc định cài đặt. Để biết thêm thông tin, vui lòng code.google.com/p/android/issues/detail?id=2037 .
anujprashar

Mã của bạn trả về cùng múi giờ với TimeZone.getDefault () trên Android 4.2. TimeZone.getDefault () sẽ trả về múi giờ đã chọn trong cài đặt -> ngày & giờ.
1088166

5
TimeZone timeZone = TimeZone.getDefault(); 
timeZone.getID();

Nó sẽ in như

Asia/Kolkata

3

Giải pháp đơn giản nhất với định dạng ngày đơn giản: 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   " );

==> Đầu ra là: +05: 30



2

Khu vực từ java.time và ThreeTenABP

Câu trả lời hiện đại:

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

Khi tôi chạy đoạn mã này theo múi giờ Úc / Sydney, đầu ra chính xác là:

Australia/Sydney

Nếu bạn muốn tên hoặc chữ viết tắt của múi giờ (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

Các TimeZonelớp học được sử dụng trong hầu hết các câu trả lời khác là những gì chúng tôi đã có khi câu hỏi được hỏi trong năm 2011, mặc dù nó được thiết kế kém. Ngày nay nó đã lỗi thời và tôi khuyên rằng thay vì chúng ta sử dụng java.time, API ngày và giờ hiện đại của Java đã xuất hiện vào năm 2014.

Câu hỏi: Không java.time yêu cầu API Android cấp 26?

java.time hoạt động độc đáo trên cả thiết bị Android cũ hơn và mới hơn. Nó chỉ cần ít nhất Java 6 .

  • Trong Java 8 trở lên và trên các thiết bị Android mới hơn (từ API cấp 26), API hiện đại được tích hợp sẵn.
  • Trong Java 6 và 7 không phải Android có được ThreeTen Backport, backport của các lớp hiện đại (ThreeTen cho JSR 310; xem các liên kết ở phía dưới).
  • Trên (cũ) Android sử dụng phiên bản Android của ThreeTen Backport. Nó được gọi là ThreeTenABP. Và hãy chắc chắn rằng bạn nhập các lớp ngày và thời gian từ org.threeten.bpvới các gói con.

Liên kết


1

Đối với các thiết bị có API 26 trở lên, bạn có thể có được nó như thế này:

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

1

Trên thiết bị của tôi TimeZone.getDefault()luôn trả về múi giờ UTC.

Tôi cần phải làm điều này để có được múi giờ người dùng được cấu hình:

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

Nó sẽ trả về múi giờ người dùng đã chọn.


0

Tất cả các câu trả lời ở đây dường như đề nghị đặt tham số daylite thành false . Điều này không chính xác đối với nhiều múi giờ thay đổi tên viết tắt tùy thuộc vào thời gian trong năm (ví dụ EST so với EDT).

Giải pháp dưới đây sẽ cung cấp cho bạn tên viết tắt chính xác theo ngày hiện tại cho múi giờ.

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

Các TimeZonelớp học là thiết kế kém và lâu lỗi thời.
Ole VV
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.