Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีดึง Time Zone ปัจจุบันใน Android ด้วย Clock API

บทนำ: java.time.Clock ใน Android

Clock ให้การเข้าถึงนาฬิกาปัจจุบัน (Instant, Date, Time) ใน Timezone ต่างๆ ใช้สำหรับการทดสอบ (Testing) และการดึง Zone ปัจจุบัน

ตัวอย่าง: แสดง System Default Time Zone

ขั้นตอนที่ 1-2: โปรเจกต์และ Layout

TextView ใน ConstraintLayout จัดกึ่งกลาง

ขั้นตอนที่ 3: MainActivity.java

package com.example.myapplication;

import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.time.Clock;
import java.time.ZoneId;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView = findViewById(R.id.dateTextView);

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            // นาฬิการะบบใน Default Zone
            Clock clock = Clock.systemDefaultZone();
            
            // ดึง ZoneId
            ZoneId zoneId = clock.getZone();
            
            // ข้อมูลเพิ่มเติม
            String zoneIdString = zoneId.getId();           // Asia/Bangkok
            String displayName = zoneId.getDisplayName(
                java.time.format.TextStyle.FULL, 
                java.util.Locale.getDefault()
            ); // เวลาอินโดจีนา (Indochina Time)

            String result = "Zone ID: " + zoneIdString + "\n" +
                           "Display Name: " + displayName + "\n" +
                           "Clock: " + clock;
            textView.setText(result);
        } else {
            textView.setText("ต้องการ Android 8.0 (API 26) ขึ้นไป");
        }
    }
}

Clock Factory Methods สำคัญ

เมธอดคำอธิบาย
systemDefaultZone()นาฬิการะบบใน Default Timezone ของอุปกรณ์
system(ZoneId zone)นาฬิการะบบใน Zone ที่ระบุ
systemUTC()นาฬิการะบบใน UTC
fixed(Instant instant, ZoneId zone)นาฬิกาคงที่ (สำหรับ Testing)
offset(Clock baseClock, Duration offset)นาฬิกาที่ Offset จาก Clock อื่น

การใช้ Clock ในการทดสอบ (Testing)

// แทนที่จะใช้ LocalDateTime.now() โดยตรง
// ให้ inject Clock เข้าไป

public class MyService {
    private final Clock clock;
    
    public MyService(Clock clock) {
        this.clock = clock;
    }
    
    public boolean isExpired(Instant expiry) {
        return Instant.now(clock).isAfter(expiry); // ใช้ clock ที่ inject
    }
}

// ใน Test: ใช้ Clock.fixed() ควบคุมเวลาได้
Clock testClock = Clock.fixed(Instant.parse("2024-01-15T10:00:00Z"), ZoneOffset.UTC);
MyService service = new MyService(testClock);

ZoneId ค่าที่พบบ่อยในไทย

  • Asia/Bangkok - เวลาอินโดจีนา (ICT, UTC+7)
  • UTC - เวลาสากล

ผลลัพธ์

Zone ID: Asia/Bangkok
Display Name: เวลาอินโดจีนา
Clock: SystemClock[Asia/Bangkok]

ข้อดีของ Clock API

  • แยกการขึ้นอยู่กับเวลาจริง (Testable)
  • รองรับ Timezone ได้ชัดเจน
  • Thread-safe