Settings -> Date and Time -> Use 24-hour format 을 Default로 설정하는 방법에 대해서 정리해 보았습니다.

일단 Use 24-hour format 기능은 onResume에서 아래와 같이 동작을 합니다.

@Override
protected void onResume() {
 super.onResume();

   ...

 ((CheckBoxPreference)mTime24Pref).setChecked(is24Hour());

   ...

}

 

private boolean is24Hour() {
  return DateFormat.is24HourFormat(this);
}

 

위의 소스를 보시면 is24HourFormat 함수를 통해서 24시간인지 아닌지를 Return해줍니다.

여기서 is24HourFormat 함수를 보면 다음과 같은데 여기서 Settings.System.TIME_12_24란 Key값을 가진 Systemproperty의 값을 받아오는 것을 확인 하실수 있습니다.

하지만 최초 부팅시 또는 초기화후 부팅시에는 value값이 존재하지 않음으로 null이 됩니다.

/**
* Returns true if user preference is set to 24-hour format.
* @param context the context to use for the content resolver
* @return true if 24 hour time format is selected, false otherwise.
*/
public static boolean is24HourFormat(Context context) {
String value = Settings.System.getString(context.getContentResolver(),
Settings.System.TIME_12_24);

if (value == null) {
Locale locale = context.getResources().getConfiguration().locale;

synchronized (sLocaleLock) {
if (sIs24HourLocale != null && sIs24HourLocale.equals(locale)) {
return sIs24Hour;
}
}

java.text.DateFormat natural =
java.text.DateFormat.getTimeInstance(
java.text.DateFormat.LONG, locale);


if (natural instanceof SimpleDateFormat) {
SimpleDateFormat sdf = (SimpleDateFormat) natural;
String pattern = sdf.toPattern();

if (pattern.indexOf('H') >= 0) {
value = "24";
} else {
value = "12";
}

} else {
value = "12";
}

synchronized (sLocaleLock) {
sIs24HourLocale = locale;
sIs24Hour = !value.equals("12");
}
}


boolean b24 = !(value == null || value.equals("12"));
return b24;
}

value 값이 null이므로 시스템으로 부터 Locale의 값을 가지고 와서 Time format을 확인한 후 value값이 12인지 24인지에 따라서 True or False를 리턴하게 됩니다.

Format의 확인 형식은 다음과 같습니다.

yyyy MM dd HH:mm             :  24시간을 표시

yyyy MM dd hh:mm a           : 12시간을 표시

여기서 "h"란 pattern을 확인 한 후 시간을 구분하게 됩니다.

하지만 여기서 한가지 의문이 생기게 됩니다.

왜 Locale을 불러오는지 말입니다.

그래서 확인한 결과 각각의 나라별 시간 표시 형식이 구분되어 있기 때문에 Locale을 사용하는 것을 확인하였습니다.

예를 들면 en_US같은 경우는 12시간을 표시하고, de_DE 같은 경우는 24시간을 표시하게 됩니다.

그래서 Locale을 사용하게 되는 것입니다.

그리고 시간의 패턴을 표시하기 위해서는 is24HourFormat 란 함수를 사용하여 확인한 후 12시간을 표시할 것인지 24시간을 표시할 것인지를 소스상에서

구분하는 것을 확인 하실수 있을것입니다.

여기까지가 24시간인지 아닌지를 체크하는 프로세스입니다.

그러면 이제 Locale을 변경을 해야되는데 이 값의 변경은 보통 SetupWizard에서 처리를 해줍니다.

하지만 SetupWizard가 없을 경우에는 Default Locale로 설정을 해주는데, 이 값은 다음과 같은 경로의 MakeFile에서 설정을 해줍니다.

Android\device\samsung\YP-GS1\Product.mk

Android\device\samsung\YP-GS1\full_YP-GS1.mk

이 파일을 열어보면, 여러 설정들이 존재하는데 그 중에서 다음과 같은 부분을 확인 할 수 있습니다.

# Overrides

PRODUCT_MANUFACTURER:=samsung

PRODUCT_BRAND:=samsung

PRODUCT_NAME:=YP-GS1

PRODUCT_DEVICE:=YP-GS1

PRODUCT_LOCALES := en_GB \

en_US en_AU en_IE en_NZ en_ZA \

   de_AT de_CH de_DE \

   fr_FR fr_CH \

   it_IT \

   es_ES \

   es_US \

   nl_NL \

   pt_PT \

   pl_PL \

   tr_TR \

   ko_KR \

   ru_RU \

   bg_BG hr_HR cs_CZ da_DK nl_BE et_EE fi_FI el_GR \

   hu_HU is_IS ga_IE kk_KZ lv_LV lt_LT mk_MK no_NO \

   pt_PT ro_RO sr_RS sk_SK sl_SI sv_SE uk_UA

여기서 Product_locales부분을 확인 할 수 있는데 여기의 첫번째 값이 en_GB이냐 ko_KR이냐에 따라 최초 부팅시 Locale의 값이 바뀌게 됩니다.

그래서 만약 영국식 영어로 설정하고 싶을 경우에는 위와 같이 en_GB를 첫번째로 넣으시면 됩니다.

Locale Default 24 hour을 설정하는 방법은 다음과 같습니다.

Android/external/ICU4C/data/locales/en_GB.txt를 열어보면 다음과 같습니다.

 // ***************************************************************************

// *
// * Copyright (C) 2007 International Business Machines
// * Corporation and others.  All Rights Reserved.
// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java
// * Source File:<path>/common/main/en_GB.xml
// *
// ***************************************************************************
en_GB{
    NumberPatterns{
        "#,##0.###",
        "¤#,##0.00",
        "#,##0%",
        "#E0",
    }
    Version{"1.54"}
    calendar{
        gregorian{
            DateTimePatterns{
                "HH:mm:ss v",
                "HH:mm:ss z",
                "HH:mm:ss",
                "HH:mm",
                "EEEE, d MMMM yyyy",
                "d MMMM yyyy",
                "d MMM yyyy",
                "dd/MM/yyyy",
                "{1} {0}",
            }
        }
    }
    delimiters{
        alternateQuotationEnd{"”"}
        alternateQuotationStart{"“"}
        quotationEnd{"’"}
        quotationStart{"‘"}
    }
    zoneStrings{
        "meta:Europe_Central"{
            cu:int{1}
        }
        "meta:Europe_Eastern"{
            cu:int{1}
        }
        "meta:Europe_Western"{
            cu:int{1}
        }
    }
}

여기서 gregorian영역안에서 Format에 해당하는 부분들을 추가해야 합니다.
예를 들면, 
dayNames, monthNames, quarters 등을 추가하여야 하며, 이를 적용한 부분의 예는 다음과 같습니다.

 
 // ***************************************************************************
// *
// * Copyright (C) 2007 International Business Machines
// * Corporation and others.  All Rights Reserved.
// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java
// * Source File:<path>/common/main/en_GB.xml
// *
// ***************************************************************************
en_GB{
    NumberPatterns{
        "#,##0.###",
        "¤#,##0.00",
        "#,##0%",
        "#E0",
    }
    Version{"1.54"}
    calendar{
        gregorian{
            DateTimePatterns{
                "HH:mm:ss v",
                "HH:mm:ss z",
                "HH:mm:ss",
                "HH:mm",
                "EEEE, d MMMM yyyy",
                "d MMMM yyyy",
                "d MMM yyyy",
                "dd/MM/yyyy",
                "{1} {0}",
            }
dayNames{ format{ abbreviated{ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", } wide{ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", } } stand-alone{ narrow{ "S", "M", "T", "W", "T", "F", "S", } } }
monthNames{ format{ abbreviated{ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", } wide{ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", } } stand-alone{ narrow{ "J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D", } } } quarters{ format{ abbreviated{ "Q1", "Q2", "Q3", "Q4", } wide{ "1st quarter", "2nd quarter", "3rd quarter", "4th quarter", } } stand-alone{ narrow{ "1", "2", "3", "4", } } }
} } delimiters{ alternateQuotationEnd{"”"} alternateQuotationStart{"“"} quotationEnd{"’"} quotationStart{"‘"} } zoneStrings{ "meta:Europe_Central"{ cu:int{1} } "meta:Europe_Eastern"{ cu:int{1} } "meta:Europe_Western"{ cu:int{1} } } }

gregorian
 영역안에 Format 영역을 추가 한 후 icudt44l.dat 파일을 생성한 후 stubdata 폴더에 복사하면 됩니다.

'안드로이드' 카테고리의 다른 글

ICU4C 빌드 방법.  (0) 2011.06.22
Time Zone 수정 방법.  (0) 2011.06.22
안드로이드 OS의 기본언어(locale) 설정하기  (0) 2011.06.15
Locale에 따른 시간 포멧 설정.  (0) 2011.06.15
PowerManager 사용시 유의점.  (0) 2011.06.13

+ Recent posts