Android는 현재 타임 스탬프를 가져 옵니까?


248

현재 타임 스탬프를 다음과 같이 얻고 싶습니다 : 1320917972

int time = (int) (System.currentTimeMillis());
Timestamp tsTemp = new Timestamp(time);
String ts =  tsTemp.toString();

2
참고로, 같은 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 Timestamp에 의해 대체 지금 레거시, java.time의 클래스. 대부분의 java.time 기능은 ThreeTen-Backport 프로젝트 에서 Java 6 & Java 7로 백 포트됩니다 . ThreeTenABP 프로젝트 에서 이전 Android에 더 적합합니다 . ThreeTenABP 사용 방법…을 참조하십시오 .
바질 부르 케

답변:


299

해결책은 다음과 같습니다.

Long tsLong = System.currentTimeMillis()/1000;
String ts = tsLong.toString();

이것은 장치의 시간대 오프셋을 고려하지 않습니다.
kjdion84

1
@ kjdion84 실례하지만 왜 중요하다고 생각합니까? 그냥 질문에 기초합니다.
Cԃ ա ԃ

82

개발자 블로그에서 :

System.currentTimeMillis()신기원 이후의 밀리 초를 나타내는 표준 "벽"시계 (시간 및 날짜)입니다. 벽시계는 사용자 또는 전화 네트워크에서 설정할 수 있으므로 ( setCurrentTimeMillis (long) 참조 ) 시간이 예상치 않게 뒤로 또는 앞으로 이동할 수 있습니다. 이 시계는 달력 또는 알람 시계 응용 프로그램과 같이 실제 날짜 및 시간과의 통신이 중요한 경우에만 사용해야합니다. 간격 또는 경과 시간 측정은 다른 시계를 사용해야합니다. 을 (를) 사용 System.currentTimeMillis()하는 경우 ACTION_TIME_TICK, ACTION_TIME_CHANGEDACTION_TIMEZONE_CHANGED의도 방송을 듣고 시간이 변경되는시기를 알아보십시오.


11
에서 developer.android.com/reference/java/lang/... 그 발견 System.nanoTime()의 대안 System.currentTimeMillis()과는 전혀 예측할 수없는 변동이 없으며, 시간 차이를 측정하기 위해 설계되었습니다.
Bianca Daniciuc

2
@ ana01 "제로 값은 일반적으로 장치가 마지막으로 부팅 될 때마다 발생하므로"같은 장치에서 기간 차이를 비교할 때만 사용할 수 있습니다. 예를 들어 데이터베이스 저장소에는 유용하지 않습니다.
Michał K

1
System.nanoTime()벽시계 시간을 표시하기에 적합하지 않은 @ ana01의 주석에 대한 메모 . 이를 위해 System.currentTimeMillis()대신 사용하십시오.
Akash Agarwal

33

1320917972 는 1970 년 1 월 1 일 00:00:00 UTC 이후의 시간 (초)을 사용하는 Unix 타임 스탬프 TimeUnit입니다. 단위 System.currentTimeMillis()를 초 단위로 변환 하는 클래스를 사용할 수 있습니다 .

String timeStamp = String.valueOf(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()));

29

SimpleDateFormat 클래스를 사용할 수 있습니다 .

SimpleDateFormat s = new SimpleDateFormat("ddMMyyyyhhmmss");
String format = s.format(new Date());

22
이것은 타임 스탬프가 아닙니다 (에포크 이후 시간)
Michał K

1
타임 스탬프도 아니고 전혀 비효율적입니다 (SimpleDateFormat 생성, 날짜 생성, 변환). 피하십시오.
Seynorth

당신은 sth에 대답하고 있지만 유효합니다.
ersks

24

현재 타임 스탬프를 얻으려면 아래 방법을 사용하십시오. 그것은 나를 위해 잘 작동합니다.

/**
 * 
 * @return yyyy-MM-dd HH:mm:ss formate date as string
 */
public static String getCurrentTimeStamp(){
    try {

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String currentDateTime = dateFormat.format(new Date()); // Find todays date

        return currentDateTime;
    } catch (Exception e) {
        e.printStackTrace();

        return null;
    }
}

37
타임 스탬프가 아닙니다.

1
@Hits, 타임 스탬프가 아닌 간단한 날짜 형식입니다. 변수 이름을 currentTimeStap으로 사용하고 있습니다.
ersks

12

간단한 사용법입니다.

long millis = new Date().getTime();

특정 형식으로 원하면 아래와 같은 포맷터가 필요합니다.

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String millisInString  = dateFormat.format(new Date());

8

누군가가 내가 필요로하는 것과 똑같은 것을 필요로하는 경우를 대비하여 파일 이름으로 사용할 수있는 사람이 읽을 수있는 타임 스탬프는 다음과 같습니다.

package com.example.xyz;

import android.text.format.Time;

/**
 * Clock utility.
 */
public class Clock {

    /**
     * Get current time in human-readable form.
     * @return current time as a string.
     */
    public static String getNow() {
        Time now = new Time();
        now.setToNow();
        String sTime = now.format("%Y_%m_%d %T");
        return sTime;
    }
    /**
     * Get current time in human-readable form without spaces and special characters.
     * The returned value may be used to compose a file name.
     * @return current time as a string.
     */
    public static String getTimeStamp() {
        Time now = new Time();
        now.setToNow();
        String sTime = now.format("%Y_%m_%d_%H_%M_%S");
        return sTime;
    }

}

1
타임 스탬프 목록을 정렬하는 가장 좋은 방법을 알려줄 수 있습니까? 나는 그것들을 스스로 분류하려고 생각했지만 더 좋은 방법이있을 것이라고 생각했다.
Abbas

나중에 읽는 사람에 대한 참조를 위해 "android.text.format.Time"은 더 이상 사용되지 않습니다
jason.kaisersmith

5

이것들을보십시오

time.setText(String.valueOf(System.currentTimeMillis()));

timeStamp to time 형식

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
String dateString = formatter.format(new Date(Long.parseLong(time.getText().toString())));
time.setText(dateString);

4

java.time

나는 현대의 답변에 기여하고 싶습니다.

    String ts = String.valueOf(Instant.now().getEpochSecond());
    System.out.println(ts);

지금 바로 실행할 때 출력 :

1543320466

1000으로 나누는 것이 많은 사람들에게는 놀라운 일이 아니지만 자신의 시간 변환을 수행하면 읽기가 매우 어려워 질 수 있으므로 피할 수 없을 때 나쁜 습관이됩니다.

Instant내가 사용 하는 클래스는 현대 Java 날짜 및 시간 API 인 java.time의 일부입니다. 새로운 Android 버전, API 레벨 26 이상에 내장되어 있습니다. 이전 Android 용으로 프로그래밍하는 경우 백 포트가 제공 될 수 있습니다 (아래 참조). 이해하고 싶지 않다면, 여전히 내장 변환을 사용합니다.

    String ts = String.valueOf(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()));
    System.out.println(ts);

이것은 sealskej의 답변과 동일합니다. 출력은 이전과 동일합니다.

질문 : Android에서 java.time을 사용할 수 있습니까?

예. java.time은 이전 및 최신 Android 장치에서 잘 작동합니다. 최소한 Java 6 만 있으면됩니다 .

  • Java 8 이상 및 최신 Android 장치 (API 레벨 26부터)에는 최신 API가 내장되어 있습니다.
  • Android 이외의 Java 6 및 7에서는 새 클래스의 백 포트 인 ThreeTen Backport를 가져옵니다 (ThreeTen for JSR 310; 맨 아래 링크 참조).
  • (구형) Android에서는 Android 버전의 ThreeTen Backport를 사용합니다. 이름이 ThreeTenABP입니다. org.threeten.bp하위 패키지 를 사용 하여 날짜 및 시간 클래스를 가져와야합니다 .

연결


1
거의 완벽한 답변 (나는 upvoted), 적어도 솔직한 의견으로는 ThreeTen Backport 참조를 제거해야합니다. 일반적으로 Java가 아닌 Android에 관한 질문이기 때문입니다. 그리고 안드로이드 초보자에게는 혼란 스러울 수 있습니다.
Slobodan Antonijević

1
@ SlobodanAntonijević 안드로이드 프로그래머는 (a) Android 26 이상을 지원하는 경우 java.time 내장을 구현 하고, (b) 26 이전의 초기 Android를 지원하는 경우 라이브러리를 추가해야 함 을 이해해야 합니다. , ThreeTenABP 라이브러리 및 (c) ThreeTenABP를 사용 하는 경우이 라이브러리는 실제로 Java에서 Android 로 적응 된 ThreeTen-Backport 의 적응이라는 것을 알고 있습니다. ThreeTenABP의 라이브러리는 단지 주변에 안드로이드 고유의 래퍼입니다 ThreeTen - 백 포트의 라이브러리입니다. 3 개의 라이브러리를 비교 한이 표 그래픽을 참조하십시오 .
Basil Bourque

@BasilBourque 당신은 완전히 정확합니다. 그러나 실제로 ThreeTen-Backport를 가져 와서 Android 앱에서 사용할 수 있지만 JAR 종속성의 성능 원인에 큰 영향을 미칩니다. 그렇기 때문에 안드로이드 개발자가 ThreeTen-Backport를 사용하지 말고 API 25 이하의 지원을 위해 ThreeTenABP를 사용해서는 안된다고 게시물이 더 구체적이어야한다고 말했습니다. 다양한 보드에서 수많은 개발자가 Android에 사용해야하는 것에 혼란을 느끼고 이름별로 비슷하게 들립니다.
Slobodan Antonijević가

좋은 지적, @ SlobodanAntonijević. 나는 그것을 조금 더 명확하게하려고 노력했다.
Ole VV

1
@ SlobodanAntonijević 이 표 는 Java 및 Android 모두에서 java.time 을 얻을 수있는 위치를 보여주는 것으로 명확하게 설명합니다.
Basil Bourque

3

코 틀린 솔루션 :

val nowInEpoch = Instant.now().epochSecond

최소 SDK 버전이 26인지 확인하십시오.


0

Hits의 답변을 사용하는 것이 좋지만 로케일 형식을 추가하면 Android 개발자가 권장 하는 방법입니다 .

try {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        return dateFormat.format(new Date()); // Find todays date
    } catch (Exception e) {
        e.printStackTrace();

        return null;
    }

0

이 코드는 Kotlin 버전입니다. 분산 에포크 시간을 제공하기 위해 마지막 숫자에 임의 셔플 정수를 추가하는 또 다른 아이디어가 있습니다.

코 틀린 버전

val randomVariance = (0..100).shuffled().first()
val currentEpoch = (System.currentTimeMilis()/1000) + randomVariance

val deltaEpoch = oldEpoch - currentEpoch

나는이 kode를 사용하는 것이 더 좋을 것이라고 생각하고 안드로이드 버전 26 이상에 의존합니다.

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