Android에서 날짜 및 시간을 형식화하는 방법은 무엇입니까?


321

년, 월, 일,시, 분이있을 때 장치 구성 날짜 및 시간에 따라 올바르게 포맷하는 방법은 무엇입니까?

답변:


291

표준 Java DateFormat 클래스를 사용하십시오.

예를 들어 현재 날짜와 시간을 표시하려면 다음을 수행하십시오.

Date date = new Date(location.getTime());
DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));

고유 한 값으로 Date 객체를 초기화 할 수 있지만 생성자는 더 이상 사용되지 않으며 실제로 Java Calendar 객체를 사용해야합니다.


42
이것은 java.text.DateFormat이 아닌 android.text.format.DateFormat입니다.
jamesh

4
기본 로케일로 설정된 결과를 제공하지만 그렇지 않은 결과를 제공한다고 주장하는 두 개의 클래스를 갖는 것은 Android IME의 경우 매우 일반적입니다. 따라서 그렇습니다. DateFormat의 android.text.format 버전을 사용하는 것을 잊지 마십시오 (java.util의 LOL을 파생하지도 않음).
mxcl

22
이 줄에 유의하십시오 : DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());반환 된 dateFormat은 java.text.DateFormat(및 NOT android.text.format.DateFormat) 유형입니다
Arye Rosenstein

2
@Harsha-이 문제를 해결하려면 DateFormat 사용을 연결하여 Android 클래스 만 참조하면되므로 모호한 클래스가 없습니다. final String dateStr = DateFormat.getDateFormat (this) .format (d); Android의 format () 메서드를 사용하고 더 깨끗한 (IMHO) 코드를 사용하고 인스턴스화 할 객체를 하나 줄입니다.
Jerry Brady

23
이 포맷터에는 원래 질문에 명시된 시간이 아닌 날짜 만 포함됩니다. 대신 동일한 패키지의 DateUtils를 사용하십시오. stackoverflow.com/questions/2983920/…
Asmo Soinio

203

내 의견 android.text.format.DateFormat.getDateFormat(context)으로는이 방법이 -- " java.text.DateFormat대신 반환되므로 혼란 스럽습니다 android.text.format.DateFormat.

따라서 아래의 조각 코드를 사용하여 현재 날짜 / 시간을 내 형식으로 가져옵니다.

android.text.format.DateFormat df = new android.text.format.DateFormat();
df.format("yyyy-MM-dd hh:mm:ss a", new java.util.Date());

or

android.text.format.DateFormat.format("yyyy-MM-dd hh:mm:ss a", new java.util.Date());

또한 다른 형식을 사용할 수 있습니다. DateFormat을 따르십시오 .


21
유용하지만 질문은 "장치 구성에 따라"라고 말했습니다. 나에게 그것은 형식의 선택을 하드 코딩하는 대신 사용자의 언어 / 국가를 기반으로 선택하거나 사용자가 직접 선택한 형식을 사용한다는 것을 의미합니다.
Chris Boyle

17
또한, 그 잊지 마세요 hh:mm:ss당신을 줄 것이다 01:00:00오후 1시를 들어, 당신은 사용해야합니다 kk:mm:ss얻을13:00:00
DNET

2
@dnet k은 하루 중 시간 (1-24) H입니다. 예를 들어 하루 중 시간 (0-23)을 의미하지 않습니까 ? HH : mm : ss? 참조 : developer.android.com/reference/java/text/SimpleDateFormat.html
Joony

1
@Joony 아니오, java.text.SimpleDateFormat( H0-23 범위의 시간에 링크하고 사용 하는 시간)과 android.text.format.DateFormat( 0-23 범위의 시간에 대한 답변과 사용 k시간)에는 차이가 있습니다.
dnet

@dnet 테스트 후에는 정확 k하지만 DateFormat상태에 대한 설명서 는 정확합니다 . 형식 문자열에 대한 표준 설명서는 SimpleDateFormat을 참조하십시오. 매우 혼란 스럽습니다. 아니면 뭔가 빠졌습니까?
Joony

145

사용할 수 있습니다 DateFormat. 전화의 기본 로케일에 따라 결과가 달라 지지만 로케일도 지정할 수 있습니다.

https://developer.android.com/reference/java/text/DateFormat.html

이것은에 대한 결과입니다

DateFormat.getDateInstance().format(date)                                          

FR 로케일 : 3 nov. 2017 년

미국 / 엔 로케일 : 1952 년 1 월 12 일


DateFormat.getDateInstance(DateFormat.SHORT).format(date)

FR 로케일 : 03/11/2017

미국 / 엔 로캘 : 12.13.52


DateFormat.getDateInstance(DateFormat.MEDIUM).format(date)

FR 로케일 : 3 nov. 2017 년

미국 / 엔 로케일 : 1952 년 1 월 12 일


DateFormat.getDateInstance(DateFormat.LONG).format(date)

FR 로케일 : 3 novembre 2017

미국 / 엔 로케일 : 1952 년 1 월 12 일


DateFormat.getDateInstance(DateFormat.FULL).format(date)

FR 로케일 : vendredi 3 novembre 2017

미국 / 엔 로케일 : 1952 년 4 월 12 일 화요일


DateFormat.getDateTimeInstance().format(date)

FR 로케일 : 3 nov. 2017 16:04:58


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(date)

FR 로캘 : 03/11/2017 16:04


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM).format(date)

FR 로캘 : 03/11/2017 16:04:58


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG).format(date)

FR 로캘 : 03/11/2017 16:04:58 GMT + 01 : 00


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.FULL).format(date)

FR 로케일 : 03/11/2017 16:04:58 heure normale d' Europe centrale


DateFormat.getTimeInstance().format(date)

FR 로캘 : 16:04:58


DateFormat.getTimeInstance(DateFormat.SHORT).format(date)

FR 로캘 : 16:04


DateFormat.getTimeInstance(DateFormat.MEDIUM).format(date)

FR 로캘 : 16:04:58


DateFormat.getTimeInstance(DateFormat.LONG).format(date)

FR 로캘 : 16:04:58 GMT + 01 : 00


DateFormat.getTimeInstance(DateFormat.FULL).format(date)

FR 로케일 : 16:04:58 heure normale d' Europe centrale



4
이 모든 사례를 한 곳에 모아 주셔서 감사합니다. 시간 만 사례를 추가 할 수있는 경우 전체 사례가됩니다.
zeeshan

41

날짜 대 로케일 날짜 문자열 :

Date date = new Date();
String stringDate = DateFormat.getDateTimeInstance().format(date);

옵션 :

   DateFormat.getDateInstance() 

-> 1969 년 12 월 31 일

   DateFormat.getDateTimeInstance() 

-> 1969 년 12 월 31 일 오후 4시 00 분

   DateFormat.getTimeInstance() 

-> 4:00:00 오후


3
DateFormat.getDateInstance ()에서 연도를 제거하는 방법?
Hardik Joshi

21

이것은 그것을 할 것입니다 :

Date date = new Date();
java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));

사용자가 Android 기기에서 언어를 변경하면 현지화됩니까?
Kannan_SJD

14

SimpleDateFormat 사용

이처럼 :

event.putExtra("starttime", "12/18/2012");

SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
Date date = format.parse(bundle.getString("starttime"));

5
예, 성능 문제를 피하기 위해 기본 로케일 사용 :new SimpleDateFormat("my-format", Locale.getDefault());
iutinvg

14

다음과 같이 : http://developer.android.com/reference/android/text/format/Time.html

Android 기본 시간 클래스를 사용하는 것이 좋습니다.

Time now = new Time();
now.setToNow();

그런 다음 형식을 지정하십시오.

Log.d("DEBUG", "Time "+now.format("%d.%m.%Y %H.%M.%S"));

1
@FireZenk : 제공 한 [link] ( developer.android.com/reference/android/text/format/Time.html ) 에 따르면 : 이 클래스에는 많은 문제가 있으므로 GregorianCalendar를 대신 사용하는 것이 좋습니다 .
ccpizza

오 ...이 이슈 정보는 나의 의견보다 새로운 것이므로, 더 이상 사용되지 않는 답변입니다
FireZenk

10

이 두 변수를 클래스 변수로 사용하십시오.

 public java.text.DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
 private Calendar mDate = null;

그리고 이것을 다음과 같이 사용하십시오 :

 mDate = Calendar.getInstance();
 mDate.set(year,months,day);                   
 dateFormat.format(mDate.getTime());

9

이것은 내 방법이며, 정의 및 입력 및 출력 형식을 지정할 수 있습니다.

public static String formattedDateFromString(String inputFormat, String outputFormat, String inputDate){
    if(inputFormat.equals("")){ // if inputFormat = "", set a default input format.
        inputFormat = "yyyy-MM-dd hh:mm:ss";
    }
    if(outputFormat.equals("")){
        outputFormat = "EEEE d 'de' MMMM 'del' yyyy"; // if inputFormat = "", set a default output format.
    }
    Date parsed = null;
    String outputDate = "";

    SimpleDateFormat df_input = new SimpleDateFormat(inputFormat, java.util.Locale.getDefault());
    SimpleDateFormat df_output = new SimpleDateFormat(outputFormat, java.util.Locale.getDefault());

    // You can set a different Locale, This example set a locale of Country Mexico.
    //SimpleDateFormat df_input = new SimpleDateFormat(inputFormat, new Locale("es", "MX"));
    //SimpleDateFormat df_output = new SimpleDateFormat(outputFormat, new Locale("es", "MX"));

    try {
        parsed = df_input.parse(inputDate);
        outputDate = df_output.format(parsed);
    } catch (Exception e) { 
        Log.e("formattedDateFromString", "Exception in formateDateFromstring(): " + e.getMessage());
    }
    return outputDate;

}

8

SimpleDateFormat

사용자 정의 패턴없이 SimpleDateFormat 사용 하여 시스템 의 사전 선택된 형식으로 시스템에서 실제 날짜와 시간을 가져옵니다 .

public static String getFormattedDate() {
    //SimpleDateFormat called without pattern
    return new SimpleDateFormat().format(Calendar.getInstance().getTime());
}

반환 :

  • 13.01.15 11:45
  • 1/13/15 10:45 오전
  • ...

7

타임 클래스에서 빌드를 사용하십시오!

Time time = new Time();
time.set(0, 0, 17, 4, 5, 1999);
Log.i("DateTime", time.format("%d.%m.%Y %H:%M:%S"));

이것은 Android Framework의 경량 Time 객체를 사용하기 때문에 최적의 솔루션입니다. developer.android.com/reference/android/text/format/Time.html
Dean Wild

13
입니다 하지 최적의 솔루션 :이 사용자의 로케일의 날짜 형식을 존중하지 않습니다.
Dan Hulme

5

다른 답변은 일반적으로 맞습니다. 나는 현대의 답변에 기여하고 싶습니다. 클래스가 Date, DateFormat그리고 SimpleDateFormat다른 답변의 대부분에 사용되는 긴 구식이되어 몇 년 동안 많은 프로그래머에 대한 문제가 발생했다. 오늘날 우리는 java.time최신 Java 날짜 및 시간 API 인 AKA JSR-310 에서 훨씬 더 나아졌습니다 . 아직 Android에서 사용할 수 있습니까? 거의 확실히! 최신 수업은 ThreeTenABP 프로젝트에서 Android로 백 포트되었습니다. 자세한 내용은 이 질문 : Android 프로젝트에서 ThreeTenABP를 사용하는 방법을 참조하십시오.

이 스 니펫은 시작해야합니다.

    int year = 2017, month = 9, day = 28, hour = 22, minute = 45;
    LocalDateTime dateTime = LocalDateTime.of(year, month, day, hour, minute);
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
    System.out.println(dateTime.format(formatter));

컴퓨터의 기본 언어를 미국 영어 또는 영국 영어로 설정하면 다음과 같이 인쇄됩니다.

Sep 28, 2017 10:45:00 PM

대신 덴마크어로 설정하면 다음과 같이 나타납니다.

28-09-2017 22:45:00

따라서 구성을 따릅니다. 그래도 장치의 날짜 및 시간 설정에 어떤 세부 사항이 적용되는지는 확실하지 않으며 전화에 따라 다를 수 있습니다.


5

이 코드는 저에게 효과적입니다!

Date d = new Date();
    CharSequence s = android.text.format.DateFormat.format("MM-dd-yy hh-mm-ss",d.getTime());
    Toast.makeText(this,s.toString(),Toast.LENGTH_SHORT).show();

5

날짜 형식 클래스는 치트 코드와 함께 작동하여 날짜를 만듭니다. 처럼

  1. M-> 7, MM-> 07, MMM-> 7 월, MMMM-> 7 월
  2. EEE-> 화요일 EEEE-> 화요일
  3. z-> EST, zzz-> EST, zzzz-> 동부 표준시

당신은 더 사기꾼을 확인하실 수 있습니다 여기에 .


4

이 코드는 현재 날짜와 시간을 반환합니다.

public String getCurrDate()
{
    String dt;
    Date cal = Calendar.getInstance().getTime();
    dt = cal.toLocaleString();
    return dt;
}

1
toLocaleString () 지원 중단됨
nspo

4

장소

밀리 초에서 로케일 형식의 날짜 또는 시간을 얻으려면 이것을 사용했습니다.

날짜와 시간

Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.getDefault());
dateFormat.format(date);

데이트

Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault());
dateFormat.format(date);

시각

Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault());
dateFormat.format(date);

다른 날짜 스타일과 시간 스타일을 사용할 수 있습니다. 스타일에 대한 자세한 내용은 여기를 참조하십시오 .



2

시험:

event.putExtra("startTime", "10/05/2012");

그리고 전달 된 변수에 접근 할 때 :

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = formatter.parse(bundle.getString("startTime"));

2

나는 이것을 다음과 같이 사용한다 :

public class DateUtils {
    static DateUtils instance;
    private final DateFormat dateFormat;
    private final DateFormat timeFormat;

    private DateUtils() {
        dateFormat = android.text.format.DateFormat.getDateFormat(MainApplication.context);
        timeFormat = android.text.format.DateFormat.getTimeFormat(MainApplication.context);
    }

    public static DateUtils getInstance() {
        if (instance == null) {
            instance = new DateUtils();
        }
        return instance;
    }

    public synchronized static String formatDateTime(long timestamp) {
        long milliseconds = timestamp * 1000;
        Date dateTime = new Date(milliseconds);
        String date = getInstance().dateFormat.format(dateTime);
        String time = getInstance().timeFormat.format(dateTime);
        return date + " " + time;
    }
}

1

사법을 피하십시오

Java (및 Android)의 Java.util.Date 및 .Calendar 및 SimpleDateFormat은 매우 문제가됩니다. 피하십시오. Sun / Oracle이 너무 나빴 기 때문에 Java 8의 새로운 java.time 패키지로 대체했습니다 (2014 년 현재 Android가 아님). 새로운 java.time것은 Joda-Time 라이브러리 에서 영감을 받았습니다 .

조다 타임

Joda-Time 은 Android에서 작동합니다.

"Joda"에 대한 StackOverflow를 검색하여 많은 예와 토론을 찾으십시오.

Joda-Time 2.4를 사용하는 약간의 소스 코드.

표준 형식.

String output = DateTime.now().toString(); 
// Current date-time in user's default time zone with a String representation formatted to the ISO 8601 standard.

현지화 된 형식.

String output = DateTimeFormat.forStyle( "FF" ).print( DateTime.now() ); 
// Full (long) format localized for this user's language and culture.

1

2016 년으로 돌아가서, 내가 원하는대로 장치 구성에 따라가 아닌 형식을 사용자 정의하려는 경우 일반적으로 문자열 리소스 파일을 사용합니다.

strings.xml에서 :

<string name="myDateFormat"><xliff:g id="myDateFormat">%1$td/%1$tm/%1$tY</xliff:g></string>

활동 중 :

Log.d(TAG, "my custom date format: "+getString(R.string.myDateFormat, new Date()));

이것은 새로운 날짜 바인딩 라이브러리 의 출시에도 유용합니다 .

레이아웃 파일에 다음과 같은 것을 가질 수 있습니다.

<TextView
    android:id="@+id/text_release_date"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:padding="2dp"
    android:text="@{@string/myDateFormat(vm.releaseDate)}"
    tools:text="0000"
    />

그리고 자바 클래스에서 :

    MovieDetailViewModel vm = new MovieDetailViewModel();
    vm.setReleaseDate(new Date());

0

안드로이드 타임 클래스는 3 가지 형식화 메소드를 제공합니다 http://developer.android.com/reference/android/text/format/Time.html

이것이 내가 한 방법입니다.

/**
* This method will format the data from the android Time class (eg. myTime.setToNow())   into the format
* Date: dd.mm.yy Time: hh.mm.ss
*/
private String formatTime(String time)
{
    String fullTime= "";
    String[] sa = new String[2];

    if(time.length()>1)
    {
        Time t = new Time(Time.getCurrentTimezone());
        t.parse(time);
        // or t.setToNow();
        String formattedTime = t.format("%d.%m.%Y %H.%M.%S");
        int x = 0;

        for(String s : formattedTime.split("\\s",2))
        {   
            System.out.println("Value = " + s);
            sa[x] = s;
            x++;
        }
        fullTime = "Date: " + sa[0] + " Time: " + sa[1];
    }
    else{
        fullTime = "No time data";
    }
    return fullTime;
}

나는 그것이 도움이되기를 바랍니다 :-)


0

너무 늦었지만 누군가에게 도움이 될 수 있습니다

DateFormat.format(format, timeInMillis);

여기 format당신이 필요 형식입니다

예 : "HH : mm"은 15:30을 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.