안드로이드 코틀린

[Kotlin][Android] 디바이스 시간 여러 지역 시간으로 변경하기

teamnova 2024. 11. 11. 12:00
728x90

오늘은 kotlin언어로 디바이스의 시간을 런던, 도쿄, 뉴욕 시간대로 변경하는 예시를 만들어 보겠습니다.



 

 

Gradle 설정

하단의 링크를 참고해 그래들 플러그인 버전에 맞춰

아래 이미지들 처럼 build.gradle(module) 파일에 디슈거링 활성화 및 필요 라이브러리들을 추가 설정해주세요

 

그래들 버전별 설정법 링크 주소

https://developer.android.com/studio/write/java8-support?hl=ko#library-desugaring

디슈거링 코어 라이브러리 활성화
Java 8 이상에서 지원해주는 API, 즉 표준 기능들을 사용하기위한 필수 라이브러리 추가

 

 

이해를 위한 설명

 

위 이미지 처럼 안드로이드 API 26 레벨 미만인 경우 자바 8버전에서 기본 제공하는 java.time 패키지 등 여러 기능을 지원받지 못합니다.

앞서 말한 그래들 설정을 하게되면 Java 8 버전, Java 11 버전의 일부 기능들을 저 레벨 안드로이드 버전들에서도 지원받을 수 있게 됩니다.

지금 만들 예시에서 사용할 java.time 패키지를 저 레벨 안드로이드 버전에서도 사용할 수 있게 하기위한 조치라 보시면 됩니다.

 

 

 

 

 

 

액티비티용 레이아웃 xml 파일 코드 (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

    <!-- 런던 버튼 -->
    <Button
        android:id="@+id/buttonLondon"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="런던 시간 보기"
        android:layout_marginBottom="8dp" />

    <!-- 도쿄 버튼 -->
    <Button
        android:id="@+id/buttonTokyo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="도쿄 시간 보기"
        android:layout_marginBottom="8dp" />

    <!-- 뉴욕 버튼 -->
    <Button
        android:id="@+id/buttonNewYork"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="뉴욕 시간 보기"
        android:layout_marginBottom="16dp" />

    <!-- 디바이스 시간을 표시하는 TextView -->
    <TextView
        android:id="@+id/deviceTimeTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="디바이스 시간 표시"
        android:textSize="18sp"
        android:layout_marginBottom="16dp" />

    <!-- 선택된 지역과 시간을 표시하는 TextView -->
    <TextView
        android:id="@+id/regionTimeTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="버튼의 지역 시간 정보 표시"
        android:textSize="18sp" />

</LinearLayout>

 

 

 

액티비티 코틀린 코드

class MainActivity : AppCompatActivity() {

    private lateinit var buttonLondon: Button
    private lateinit var buttonTokyo: Button
    private lateinit var buttonNewYork: Button
    private lateinit var deviceTimeTextView: TextView
    private lateinit var regionTimeTextView: TextView

    // 보여줄 시간 형식 설정 및 해당 정보 변수에 할당
    private val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 뷰 초기화
        buttonLondon = findViewById(R.id.buttonLondon) //런던 시간 보기 용 버튼
        buttonTokyo = findViewById(R.id.buttonTokyo) //도쿄 시간 보기 용 버튼
        buttonNewYork = findViewById(R.id.buttonNewYork) //뉴욕 시간 보기 용 버튼
        deviceTimeTextView = findViewById(R.id.deviceTimeTextView) //기기 시간 보여줄 텍스트뷰
        regionTimeTextView = findViewById(R.id.regionTimeTextView) //지역 시간 보여줄 텍스트뷰

        // 런던 시간 보기 용 버튼 이벤트 설정
        buttonLondon.setOnClickListener {
            updateTimes("Europe/London", "런던")
        }

        //도쿄 시간 보기 용 버튼 이벤트 설정
        buttonTokyo.setOnClickListener {
            updateTimes("Asia/Tokyo", "도쿄")
        }

        //뉴욕 시간 보기 용 버튼 이벤트 설정
        buttonNewYork.setOnClickListener {
            updateTimes("America/New_York", "뉴욕")
        }
    }

    //기기 시간 기준 지역별 시간 정보 업데이트 메서드
    private fun updateTimes(zoneIdString: String, regionName: String) {
        // 디바이스의 현재 시간 가져오기
        val deviceDateTime = ZonedDateTime.now()
        val deviceZone = ZoneId.systemDefault()

        // 디바이스 시간 표시
        deviceTimeTextView.text = "디바이스 시간 (${deviceZone.id}): ${deviceDateTime.format(formatter)}"

        // 선택된 지역의 시간으로 변환
        val regionZoneId = ZoneId.of(zoneIdString)
        val regionDateTime = deviceDateTime.withZoneSameInstant(regionZoneId)

        // 선택된 지역 시간 표시
        regionTimeTextView.text = "$regionName 시간 (${zoneIdString}): ${regionDateTime.format(formatter)}"
    }
}



 

 

 

 

 

 

 

 

실행 영상

 

디바이스 시간을 뉴욕, 도쿄, 런던 시간대로 변경해주는 것을 확인할 수 있습니다.