Java에서 "시간 전"을 계산하는 방법은 무엇입니까?


127

Ruby on Rails에는 날짜를 가져 와서 "오래된"날짜를 인쇄 할 수있는 기능이 있습니다.

예를 들면 다음과 같습니다.

8 minutes ago
8 hours ago
8 days ago
8 months ago
8 years ago

Java로 이것을 쉽게 할 수있는 방법이 있습니까?


1
참조 : stackoverflow.com/questions/11/how-do-i-calculate-relative-time C #이지만 약간의 문제없이 변환 할 수 있다고 확신합니다.
Brandon

답변:


177

PrettyTime 라이브러리를 살펴보십시오 .

사용이 매우 간단합니다.

import org.ocpsoft.prettytime.PrettyTime;

PrettyTime p = new PrettyTime();
System.out.println(p.format(new Date()));
// prints "moments ago"

국제화 된 메시지를 위해 로케일을 전달할 수도 있습니다.

PrettyTime p = new PrettyTime(new Locale("fr"));
System.out.println(p.format(new Date()));
// prints "à l'instant"

의견에서 언급했듯이 Android에는이 기능이 내장되어 있습니다. android.text.format.DateUtils 클래스에 있습니다.


229
android에서 작업하는 경우 다음을 사용할 수 있습니다. android.text.format.DateUtils # getRelativeTimeSpanString ()
Somatik

답변에 더 많은 설명을 추가 할 수 있습니까? 링크 전용 답변이 좋지 않습니다.
Ajay S

@Somatik 안드로이드가 아닌 플랫폼에서 이것을 얻으려면 AOSP에서 해당 클래스있습니다 .
greg7gkb

@ataylor 이것이 Android에서 어떻게 사용됩니까 ??
Hardik Parmar

getRelativeTimeSpanString은 모든 상황에 이상적이지 않으므로 여기에 많은 예제를 기반으로 자체 클래스를 작성했습니다. 아래 내 솔루션을 참조하십시오 : stackoverflow.com/a/37042254/468360
Codeversed

67

TimeUnit 열거 형 을 고려 했습니까 ? 이런 종류의 일에는 꽤 유용 할 수 있습니다.

    try {
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
        Date past = format.parse("01/10/2010");
        Date now = new Date();

        System.out.println(TimeUnit.MILLISECONDS.toMillis(now.getTime() - past.getTime()) + " milliseconds ago");
        System.out.println(TimeUnit.MILLISECONDS.toMinutes(now.getTime() - past.getTime()) + " minutes ago");
        System.out.println(TimeUnit.MILLISECONDS.toHours(now.getTime() - past.getTime()) + " hours ago");
        System.out.println(TimeUnit.MILLISECONDS.toDays(now.getTime() - past.getTime()) + " days ago");
    }
    catch (Exception j){
        j.printStackTrace();
    }

4
시간 단위가 독립적이기 때문에 이것이 완전한 대답이라고 생각하지 않습니다. 예를 들어-밀리 초 시간은 분 시간 * 60 * 1000입니다. "이전 시간에 사용할 수 있으려면 다음 시간 단위 (낮은 시간 단위로 변환 한 후)에서 시간 단위를 줄여야합니다. "문자열.
Nativ

@Benj- 맞습니까? 위의 솔루션? 한 시간은 12 시간 형식이고 다른 시간은 24 시간 형식이기 때문입니다. 내 질문에 대한 귀하의 의견을 알려주세요. 미리 감사드립니다.
스위프트

이것은 정확하지 않습니다 ... 각 유닛은 이미 언급했듯이 서로 독립적입니다.
Jonathan Laliberte

1
android 당신을 위해 그것을 않습니다 android에서 작업하는 경우 이것을 사용할 수 있습니다 : android.text.format.DateUtils.getRelativeTimeSpanString (milliseconds)
Wajid Ali

50

RealHowTo와 Ben J의 답변을 받아 내 버전을 만듭니다.

public class TimeAgo {
public static final List<Long> times = Arrays.asList(
        TimeUnit.DAYS.toMillis(365),
        TimeUnit.DAYS.toMillis(30),
        TimeUnit.DAYS.toMillis(1),
        TimeUnit.HOURS.toMillis(1),
        TimeUnit.MINUTES.toMillis(1),
        TimeUnit.SECONDS.toMillis(1) );
public static final List<String> timesString = Arrays.asList("year","month","day","hour","minute","second");

public static String toDuration(long duration) {

    StringBuffer res = new StringBuffer();
    for(int i=0;i< TimeAgo.times.size(); i++) {
        Long current = TimeAgo.times.get(i);
        long temp = duration/current;
        if(temp>0) {
            res.append(temp).append(" ").append( TimeAgo.timesString.get(i) ).append(temp != 1 ? "s" : "").append(" ago");
            break;
        }
    }
    if("".equals(res.toString()))
        return "0 seconds ago";
    else
        return res.toString();
}
public static void main(String args[]) {
    System.out.println(toDuration(123));
    System.out.println(toDuration(1230));
    System.out.println(toDuration(12300));
    System.out.println(toDuration(123000));
    System.out.println(toDuration(1230000));
    System.out.println(toDuration(12300000));
    System.out.println(toDuration(123000000));
    System.out.println(toDuration(1230000000));
    System.out.println(toDuration(12300000000L));
    System.out.println(toDuration(123000000000L));
}}

다음을 인쇄합니다

0 second ago
1 second ago
12 seconds ago
2 minutes ago
20 minutes ago
3 hours ago
1 day ago
14 days ago
4 months ago
3 years ago

정말 멋진. 그리고 week (s)와 같은 다른 시간 단위를 추가하는 것은 정말 쉽습니다
Piotr

1
이것은 더 많은지지를받을 가치가 있습니다. 우선, 도서관이 필요 없습니다. 여전히 깨끗하고 우아하며 변경하기 쉽습니다.
fangzhzh

작은 오타 : 코드 내에서 "TimeAgo"대신 정적 속성 "Lists"를 참조하고 있습니다. Lists.times.get (i)은 TimeAgo.get (i) ...이어야합니다.
Diogo Gomes

2
리틀 제안 : 사용 .append(temp != 1 ? "s" : "")대신에 .append(temp > 1 ? "s" : "")0도해야하기 때문에 s접미사
버 커스

1
@ShajeelAfzal 예, duration 매개 변수는 밀리 초 단위이지만 시간이 절대 값이 아닌 차이입니다. 당신이 얻는 것은 유닉스 타임 스탬프가 시작된 날짜 인 1970 년 1 월 1 일부터 지나간 시간입니다
Riccardo Casatta

42
  public class TimeUtils {

      public final static long ONE_SECOND = 1000;
      public final static long SECONDS = 60;

      public final static long ONE_MINUTE = ONE_SECOND * 60;
      public final static long MINUTES = 60;

      public final static long ONE_HOUR = ONE_MINUTE * 60;
      public final static long HOURS = 24;

      public final static long ONE_DAY = ONE_HOUR * 24;

      private TimeUtils() {
      }

      /**
       * converts time (in milliseconds) to human-readable format
       *  "<w> days, <x> hours, <y> minutes and (z) seconds"
       */
      public static String millisToLongDHMS(long duration) {
        StringBuffer res = new StringBuffer();
        long temp = 0;
        if (duration >= ONE_SECOND) {
          temp = duration / ONE_DAY;
          if (temp > 0) {
            duration -= temp * ONE_DAY;
            res.append(temp).append(" day").append(temp > 1 ? "s" : "")
               .append(duration >= ONE_MINUTE ? ", " : "");
          }

          temp = duration / ONE_HOUR;
          if (temp > 0) {
            duration -= temp * ONE_HOUR;
            res.append(temp).append(" hour").append(temp > 1 ? "s" : "")
               .append(duration >= ONE_MINUTE ? ", " : "");
          }

          temp = duration / ONE_MINUTE;
          if (temp > 0) {
            duration -= temp * ONE_MINUTE;
            res.append(temp).append(" minute").append(temp > 1 ? "s" : "");
          }

          if (!res.toString().equals("") && duration >= ONE_SECOND) {
            res.append(" and ");
          }

          temp = duration / ONE_SECOND;
          if (temp > 0) {
            res.append(temp).append(" second").append(temp > 1 ? "s" : "");
          }
          return res.toString();
        } else {
          return "0 second";
        }
      }


      public static void main(String args[]) {
        System.out.println(millisToLongDHMS(123));
        System.out.println(millisToLongDHMS((5 * ONE_SECOND) + 123));
        System.out.println(millisToLongDHMS(ONE_DAY + ONE_HOUR));
        System.out.println(millisToLongDHMS(ONE_DAY + 2 * ONE_SECOND));
        System.out.println(millisToLongDHMS(ONE_DAY + ONE_HOUR + (2 * ONE_MINUTE)));
        System.out.println(millisToLongDHMS((4 * ONE_DAY) + (3 * ONE_HOUR)
            + (2 * ONE_MINUTE) + ONE_SECOND));
        System.out.println(millisToLongDHMS((5 * ONE_DAY) + (4 * ONE_HOUR)
            + ONE_MINUTE + (23 * ONE_SECOND) + 123));
        System.out.println(millisToLongDHMS(42 * ONE_DAY));
        /*
          output :
                0 second
                5 seconds
                1 day, 1 hour
                1 day and 2 seconds
                1 day, 1 hour, 2 minutes
                4 days, 3 hours, 2 minutes and 1 second
                5 days, 4 hours, 1 minute and 23 seconds
                42 days
         */
    }
}

more @ 지속 시간을 밀리 초 단위로 사람이 읽을 수있는 형식으로 지정


나는 이것의 개정 버전을 사용했다. 내 개정판을 게시했습니다.
David Blevins

5
데이비드 블레 빈스, PrettyTime에 대한 자세한 예 : stackoverflow.com/questions/3859288/... 큰 -1 제 3 자 라이브러리 - P를 한 번 더하지 바퀴를 개혁 추천을위한
zakmck

9

이것은 RealHowTo의 답변을 기반으로하므로 마음에 든다면 사랑을주십시오.

이 정리 버전을 사용하면 관심있는 시간 범위를 지정할 수 있습니다.

또한 "및"부분을 조금 다르게 처리합니다. 문자열을 구분 기호로 결합 할 때 복잡한 논리를 건너 뛰고 완료되면 마지막 구분 기호를 삭제하는 것이 더 쉬운 경우가 많습니다.

import java.util.concurrent.TimeUnit;
import static java.util.concurrent.TimeUnit.MILLISECONDS;

public class TimeUtils {

    /**
     * Converts time to a human readable format within the specified range
     *
     * @param duration the time in milliseconds to be converted
     * @param max      the highest time unit of interest
     * @param min      the lowest time unit of interest
     */
    public static String formatMillis(long duration, TimeUnit max, TimeUnit min) {
        StringBuilder res = new StringBuilder();

        TimeUnit current = max;

        while (duration > 0) {
            long temp = current.convert(duration, MILLISECONDS);

            if (temp > 0) {
                duration -= current.toMillis(temp);
                res.append(temp).append(" ").append(current.name().toLowerCase());
                if (temp < 2) res.deleteCharAt(res.length() - 1);
                res.append(", ");
            }

            if (current == min) break;

            current = TimeUnit.values()[current.ordinal() - 1];
        }

        // clean up our formatting....

        // we never got a hit, the time is lower than we care about
        if (res.lastIndexOf(", ") < 0) return "0 " + min.name().toLowerCase();

        // yank trailing  ", "
        res.deleteCharAt(res.length() - 2);

        //  convert last ", " to " and"
        int i = res.lastIndexOf(", ");
        if (i > 0) {
            res.deleteCharAt(i);
            res.insert(i, " and");
        }

        return res.toString();
    }
}

소용돌이를주는 작은 코드 :

import static java.util.concurrent.TimeUnit.*;

public class Main {

    public static void main(String args[]) {
        long[] durations = new long[]{
            123,
            SECONDS.toMillis(5) + 123,
            DAYS.toMillis(1) + HOURS.toMillis(1),
            DAYS.toMillis(1) + SECONDS.toMillis(2),
            DAYS.toMillis(1) + HOURS.toMillis(1) + MINUTES.toMillis(2),
            DAYS.toMillis(4) + HOURS.toMillis(3) + MINUTES.toMillis(2) + SECONDS.toMillis(1),
            DAYS.toMillis(5) + HOURS.toMillis(4) + MINUTES.toMillis(1) + SECONDS.toMillis(23) + 123,
            DAYS.toMillis(42)
        };

        for (long duration : durations) {
            System.out.println(TimeUtils.formatMillis(duration, DAYS, SECONDS));
        }

        System.out.println("\nAgain in only hours and minutes\n");

        for (long duration : durations) {
            System.out.println(TimeUtils.formatMillis(duration, HOURS, MINUTES));
        }
    }

}

다음을 출력합니다 :

0 seconds
5 seconds 
1 day and 1 hour 
1 day and 2 seconds 
1 day, 1 hour and 2 minutes 
4 days, 3 hours, 2 minutes and 1 second 
5 days, 4 hours, 1 minute and 23 seconds 
42 days 

Again in only hours and minutes

0 minutes
0 minutes
25 hours 
24 hours 
25 hours and 2 minutes 
99 hours and 2 minutes 
124 hours and 1 minute 
1008 hours 

그리고 누군가가 필요로하는 경우 위와 같은 문자열 을 밀리 초로 다시 변환하는 클래스가 있습니다. 사람들이 읽을 수있는 텍스트로 다양한 것들의 타임 아웃을 지정할 수 있도록하는 데 매우 유용합니다.


9

이를 수행하는 간단한 방법이 있습니다.

20 분 전에 시간을 원한다고 가정 해 봅시다.

Long minutesAgo = new Long(20);
Date date = new Date();
Date dateIn_X_MinAgo = new Date (date.getTime() - minutesAgo*60*1000);

그게 다야 ..


1
대부분의 경우 "스마트"디스플레이를 원합니다. 5125 분 전에 x 일 전에 알려줍니다.
PhiLho

7

내장 된 솔루션 :

Java는 상대 시간 형식 지정을 기본적으로 지원하지 않으며 Java-8 및 새 패키지도 지원하지 않습니다. java.time . 영어와 다른 것이 필요하지 않고 손으로 만든 솔루션 만 허용되는 경우 @RealHowTo의 답변을 참조하십시오 (즉석 델타를 현지 시간으로 변환하는 시간대를 고려하지 않는 것이 큰 단점이 있지만) 단위!). 어쨌든, 특히 다른 로케일에 대해 집에서 만든 복잡한 해결 방법을 피하려면 외부 라이브러리가 필요합니다.

후자의 경우 내 라이브러리 Time4J (또는 Android의 Time4A) 를 사용하는 것이 좋습니다 . 그것은 제공하는 최고의 유연성과 가장 국제화 파워 . net.time4j.PrettyTime 클래스 에는 printRelativeTime...(...)이 목적을위한 7 가지 메소드 가 있습니다. 테스트 클럭을 시간 소스로 사용하는 예 :

TimeSource<?> clock = () -> PlainTimestamp.of(2015, 8, 1, 10, 24, 5).atUTC();
Moment moment = PlainTimestamp.of(2015, 8, 1, 17, 0).atUTC(); // our input
String durationInDays =
  PrettyTime.of(Locale.GERMAN).withReferenceClock(clock).printRelative(
    moment,
    Timezone.of(EUROPE.BERLIN),
    TimeUnit.DAYS); // controlling the precision
System.out.println(durationInDays); // heute (german word for today)

java.time.Instant입력으로 사용 하는 다른 예 :

String relativeTime = 
  PrettyTime.of(Locale.ENGLISH)
    .printRelativeInStdTimezone(Moment.from(Instant.EPOCH));
System.out.println(relativeTime); // 45 years ago

이 라이브러리는 최신 버전 (v4.17) 80 개 언어 및 일부 국가 별 로켈 (특히 스페인어, 영어, 아랍어, 프랑스어)을 지원합니다. i18n 데이터는 주로 최신 CLDR 버전 v29를 기반으로합니다 . 이 라이브러리를 사용해야하는 다른 중요한 이유 는 복수 규칙 (다른 로케일에서는 영어와 다른 경우가 많음), 약어 형식 스타일 (예 : "1 초 전") 및 시간대를 고려하는 표현적인 방법을 잘 지원하기 때문 입니다. Time4J는 상대 시간 계산에서 윤초 와 같은 이국적인 세부 사항을 알고 있습니다 (실제로 중요하지는 않지만 기대 지평과 관련된 메시지를 형성 함). Java-8과호환성같은 종류의 쉽게 사용할 수 변환 방법에 의한 존재 java.time.Instantjava.time.Period.

단점이 있습니까? 단 두개.

  • 라이브러리는 작지 않습니다 (큰 i18n 데이터 저장소 때문에).
  • API는 잘 알려져 있지 않으므로 커뮤니티 지식과 지원은 제공되지 않지만 제공된 문서는 매우 상세하고 포괄적입니다.

(소형) 대안 :

더 작은 솔루션을 찾고 많은 기능이 필요하지 않고 i18n-data와 관련된 가능한 품질 문제를 용인하려는 경우 :

  • 나는 ocpsoft / PrettyTime (실제로 32 가지 언어 (곧 34?) java.util.Date만 지원하는 것이 좋습니다 -@ataylor의 답변 참조)을 권장합니다. 커뮤니티 규모가 큰 업계 표준 CLDR (유니 코드 컨소시엄)은 불행히도 i18n 데이터의 기반이 아니므로 데이터의 추가 향상 또는 개선에 시간이 오래 걸릴 수 있습니다.

  • Android에있는 경우 도우미 클래스 android.text.format.DateUtils 는 슬림 한 내장 대안입니다 (여기에서 몇 달 동안 지원되지 않는다는 단점이있는 여기의 다른 의견 및 답변 참조). 이 도우미 클래스의 API 스타일을 좋아하는 사람은 거의 없습니다.

  • Joda-Time 의 팬이라면 PeriodFormat 클래스 (버전 v2.9.4에서 14 개 언어 지원, 반대편 에서)를 볼 수 있습니다 . Joda-Time도 확실히 컴팩트하지 않으므로 여기에 언급했습니다. 완전성). 이 라이브러리는 상대 시간이 전혀 지원되지 않기 때문에 실제 답변이 아닙니다. 최소한 문자 그대로 "ago"를 추가해야합니다 (그리고 생성 된 목록 형식에서 모든 하위 단위를 수동으로 제거-어색함). Time4J 또는 Android-DateUtils와 달리 약어 또는 상대 시간에서 절대 시간 표현으로의 자동 전환을 특별히 지원하지 않습니다. PrettyTime과 마찬가지로 Java 커뮤니티의 개인 구성원이 i18n 데이터에 확인하지 않은 기여도에 전적으로 의존합니다.


5

간단한 "오늘", "어제"또는 "x 일 전"을 찾는 경우

private String getDaysAgo(Date date){
    long days = (new Date().getTime() - date.getTime()) / 86400000;

    if(days == 0) return "Today";
    else if(days == 1) return "Yesterday";
    else return days + " days ago";
}

5

java.time

Java 8 이상에 내장 된 java.time 프레임 워크 사용

LocalDateTime t1 = LocalDateTime.of(2015, 1, 1, 0, 0, 0);
LocalDateTime t2 = LocalDateTime.now();
Period period = Period.between(t1.toLocalDate(), t2.toLocalDate());
Duration duration = Duration.between(t1, t2);

System.out.println("First January 2015 is " + period.getYears() + " years ago");
System.out.println("First January 2015 is " + period.getMonths() + " months ago");
System.out.println("First January 2015 is " + period.getDays() + " days ago");
System.out.println("First January 2015 is " + duration.toHours() + " hours ago");
System.out.println("First January 2015 is " + duration.toMinutes() + " minutes ago");

1
이러한 Duration방법은 전체 지속 시간을 총 시간 수와 총 분 수로 보고합니다 . Java 8에서 클래스 에는 시간, 분 및 초의 각 부분 을 얻는 메소드가 이상하게 없었 습니다. Java 9는 이러한 방법을 제공 to…Part합니다.
Basil Bourque


4

Android 용 앱을 개발하는 경우 이러한 모든 요구 사항에 대해 유틸리티 클래스 DateUtils 를 제공합니다 . DateUtils # getRelativeTimeSpanString () 유틸리티 메소드를 살펴보십시오 .

에 대한 문서에서

CharSequence getRelativeTimeSpanString (오랜 시간, 긴 시간, 긴 minResolution)

'time'을 'now'와 관련된 시간으로 설명하는 문자열을 반환합니다. 과거의 시간 범위는 "42 분 전"과 같은 형식입니다. 향후 시간 범위는 "42 분 안에"와 같이 형식이 지정됩니다.

당신은 당신을 통과 할 것 timestamp같은 시간System.currentTimeMillis()같은 지금 . 는 minResolution당신이 최소의 시간 범위가보고 지정할 수 있습니다.

예를 들어, MINUTE_IN_MILLIS로 설정된 경우 과거 3 초의 시간은 "0 분 전"으로보고됩니다. 0, MINUTE_IN_MILLIS, HOUR_IN_MILLIS, DAY_IN_MILLIS, WEEK_IN_MILLIS 등 중 하나를 전달하십시오.


4

이 기능을 사용하여 시간을 계산할 수 있습니다

 private String timeAgo(long time_ago) {
        long cur_time = (Calendar.getInstance().getTimeInMillis()) / 1000;
        long time_elapsed = cur_time - time_ago;
        long seconds = time_elapsed;
        int minutes = Math.round(time_elapsed / 60);
        int hours = Math.round(time_elapsed / 3600);
        int days = Math.round(time_elapsed / 86400);
        int weeks = Math.round(time_elapsed / 604800);
        int months = Math.round(time_elapsed / 2600640);
        int years = Math.round(time_elapsed / 31207680);

        // Seconds
        if (seconds <= 60) {
            return "just now";
        }
        //Minutes
        else if (minutes <= 60) {
            if (minutes == 1) {
                return "one minute ago";
            } else {
                return minutes + " minutes ago";
            }
        }
        //Hours
        else if (hours <= 24) {
            if (hours == 1) {
                return "an hour ago";
            } else {
                return hours + " hrs ago";
            }
        }
        //Days
        else if (days <= 7) {
            if (days == 1) {
                return "yesterday";
            } else {
                return days + " days ago";
            }
        }
        //Weeks
        else if (weeks <= 4.3) {
            if (weeks == 1) {
                return "a week ago";
            } else {
                return weeks + " weeks ago";
            }
        }
        //Months
        else if (months <= 12) {
            if (months == 1) {
                return "a month ago";
            } else {
                return months + " months ago";
            }
        }
        //Years
        else {
            if (years == 1) {
                return "one year ago";
            } else {
                return years + " years ago";
            }
        }
    }

1) 여기서 time_ago는 마이크로 초입니다


4

여기에 많은 답변을 바탕으로 사용 사례에 대해 다음을 만들었습니다.

사용법 예 :

String relativeDate = String.valueOf(
                TimeUtils.getRelativeTime( 1000L * myTimeInMillis() ));

import java.util.Arrays;
import java.util.List;

import static java.util.concurrent.TimeUnit.DAYS;
import static java.util.concurrent.TimeUnit.HOURS;
import static java.util.concurrent.TimeUnit.MINUTES;
import static java.util.concurrent.TimeUnit.SECONDS;

/**
 * Utilities for dealing with dates and times
 */
public class TimeUtils {

    public static final List<Long> times = Arrays.asList(
        DAYS.toMillis(365),
        DAYS.toMillis(30),
        DAYS.toMillis(7),
        DAYS.toMillis(1),
        HOURS.toMillis(1),
        MINUTES.toMillis(1),
        SECONDS.toMillis(1)
    );

    public static final List<String> timesString = Arrays.asList(
        "yr", "mo", "wk", "day", "hr", "min", "sec"
    );

    /**
     * Get relative time ago for date
     *
     * NOTE:
     *  if (duration > WEEK_IN_MILLIS) getRelativeTimeSpanString prints the date.
     *
     * ALT:
     *  return getRelativeTimeSpanString(date, now, SECOND_IN_MILLIS, FORMAT_ABBREV_RELATIVE);
     *
     * @param date String.valueOf(TimeUtils.getRelativeTime(1000L * Date/Time in Millis)
     * @return relative time
     */
    public static CharSequence getRelativeTime(final long date) {
        return toDuration( Math.abs(System.currentTimeMillis() - date) );
    }

    private static String toDuration(long duration) {
        StringBuilder sb = new StringBuilder();
        for(int i=0;i< times.size(); i++) {
            Long current = times.get(i);
            long temp = duration / current;
            if (temp > 0) {
                sb.append(temp)
                  .append(" ")
                  .append(timesString.get(i))
                  .append(temp > 1 ? "s" : "")
                  .append(" ago");
                break;
            }
        }
        return sb.toString().isEmpty() ? "now" : sb.toString();
    }
}

매우 유용합니다. 대단히 감사합니다.
Haya Akkad 2016 년

3

joda 시간 패키지의 개념이 기간을 . 기간 및 날짜 시간으로 산술을 수행 할 수 있습니다.

로부터 문서 :

public boolean isRentalOverdue(DateTime datetimeRented) {
  Period rentalPeriod = new  Period().withDays(2).withHours(12);
  return datetimeRented.plus(rentalPeriod).isBeforeNow();
}


2

성능을 고려하면 더 나은 코드이며 계산 횟수가 줄어 듭니다. 이유 분은 초 수가 60보다 큰 경우에만 계산되고 시간은 분이 60보다 큰 경우에만 계산됩니다 ...

class timeAgo {

static String getTimeAgo(long time_ago) {
    time_ago=time_ago/1000;
    long cur_time = (Calendar.getInstance().getTimeInMillis())/1000 ;
    long time_elapsed = cur_time - time_ago;
    long seconds = time_elapsed;
   // Seconds
    if (seconds <= 60) {
        return "Just now";
    }
    //Minutes
    else{
        int minutes = Math.round(time_elapsed / 60);

        if (minutes <= 60) {
            if (minutes == 1) {
                return "a minute ago";
            } else {
                return minutes + " minutes ago";
            }
        }
        //Hours
        else {
            int hours = Math.round(time_elapsed / 3600);
            if (hours <= 24) {
                if (hours == 1) {
                    return "An hour ago";
                } else {
                    return hours + " hrs ago";
                }
            }
            //Days
            else {
                int days = Math.round(time_elapsed / 86400);
                if (days <= 7) {
                    if (days == 1) {
                        return "Yesterday";
                    } else {
                        return days + " days ago";
                    }
                }
                //Weeks
                else {
                    int weeks = Math.round(time_elapsed / 604800);
                    if (weeks <= 4.3) {
                        if (weeks == 1) {
                            return "A week ago";
                        } else {
                            return weeks + " weeks ago";
                        }
                    }
                    //Months
                    else {
                        int months = Math.round(time_elapsed / 2600640);
                        if (months <= 12) {
                            if (months == 1) {
                                return "A month ago";
                            } else {
                                return months + " months ago";
                            }
                        }
                        //Years
                        else {
                            int years = Math.round(time_elapsed / 31207680);
                            if (years == 1) {
                                return "One year ago";
                            } else {
                                return years + " years ago";
                            }
                        }
                    }
                }
            }
        }
    }

}

}

1
android에서 작업하는 경우 다음을 사용할 수 있습니다. android.text.format.DateUtils.getRelativeTimeSpanString (milliseconds)
Wajid Ali

2

java.time

Habsq답변 은 올바른 아이디어이지만 잘못된 방법을 가지고 있습니다.

년-월-일 단위로 타임 라인에 연결되지 않은 시간 범위에 대해서는을 사용하십시오 Period. 달력 및 시간-분-초와 관련이없는 24 시간 청크를 의미하는 날에는을 사용하십시오 Duration. 두 스케일을 혼합하는 것은 거의 의미가 없습니다.

Duration

클래스를 사용하여 UTC에 표시된 현재 순간을 가져 와서 시작하십시오 Instant.

Instant now = Instant.now();  // Capture the current moment as seen in UTC.
Instant then = now.minus( 8L , ChronoUnit.HOURS ).minus( 8L , ChronoUnit.MINUTES ).minus( 8L , ChronoUnit.SECONDS );
Duration d = Duration.between( then , now );

시간, 분 및 초의 텍스트를 생성하십시오.

// Generate text by calling `to…Part` methods.
String output = d.toHoursPart() + " hours ago\n" + d.toMinutesPart() + " minutes ago\n" + d.toSecondsPart() + " seconds ago";

콘솔로 덤프하십시오.

System.out.println( "From: " + then + " to: " + now );
System.out.println( output );

에서 : 2019-06-04T11 : 53 : 55.714965Z까지 : 2019-06-04T20 : 02 : 03.714965Z

8 시간 전

8 분 전

8 초 전

Period

현재 날짜를 얻는 것으로 시작하십시오.

시간대는 날짜를 결정하는 데 중요합니다. 주어진 순간마다 날짜는 지구마다 다릅니다. 예를 들어 파리 에서 자정이 지나고 몇 분 후에 프랑스 는 새로운 날이며 몬트리올 퀘벡 에서는 여전히 "어제"입니다 .

시간대를 지정하지 않으면 JVM은 현재 기본 시간대를 내재적으로 적용합니다. 이 기본값은 런타임 (!) 중에 언제든지 변경 될 수 있으므로 결과가 다를 수 있습니다. 원하는 / 예상 시간대를 명시 적으로 인수로 지정하는 것이 좋습니다. 중요한 경우 사용자와 영역을 확인하십시오.

지정 적절한 시간대 이름 의 형식 Continent/Region예컨대, America/Montreal, Africa/Casablanca, 또는 Pacific/Auckland. 표준 시간대 가 아니EST 거나 표준화되지 않았으며 고유하지 않은IST 것과 같은 2-4 자의 약어를 사용하지 마십시오 .

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

8 일, 몇 달, 몇 년 전에 날짜를 다시 만드십시오.

LocalDate then = today.minusYears( 8 ).minusMonths( 8 ).minusDays( 7 ); // Notice the 7 days, not 8, because of granularity of months. 

경과 시간을 계산하십시오.

Period p = Period.between( then , today );

"시간 전"조각의 문자열을 작성하십시오.

String output = p.getDays() + " days ago\n" + p.getMonths() + " months ago\n" + p.getYears() + " years ago";

콘솔로 덤프하십시오.

System.out.println( "From: " + then + " to: " + today );
System.out.println( output );

에서 : 2010-09-27까지 : 2019-06-04

8 일 전

8 개월 전

8 년 전


java.time에 대하여

java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date, Calendar, SimpleDateFormat.

자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.

Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.

java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이 필요없고 수업이 필요 없습니다 .java.sql.*

java.time 클래스는 어디서 구할 수 있습니까?

ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 .


정말 고맙습니다!
Ticherhaz

1

오랜 연구 끝에 나는 이것을 발견했다.

    public class GetTimeLapse {
    public static String getlongtoago(long createdAt) {
        DateFormat userDateFormat = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy");
        DateFormat dateFormatNeeded = new SimpleDateFormat("MM/dd/yyyy HH:MM:SS");
        Date date = null;
        date = new Date(createdAt);
        String crdate1 = dateFormatNeeded.format(date);

        // Date Calculation
        DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        crdate1 = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(date);

        // get current date time with Calendar()
        Calendar cal = Calendar.getInstance();
        String currenttime = dateFormat.format(cal.getTime());

        Date CreatedAt = null;
        Date current = null;
        try {
            CreatedAt = dateFormat.parse(crdate1);
            current = dateFormat.parse(currenttime);
        } catch (java.text.ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // Get msec from each, and subtract.
        long diff = current.getTime() - CreatedAt.getTime();
        long diffSeconds = diff / 1000;
        long diffMinutes = diff / (60 * 1000) % 60;
        long diffHours = diff / (60 * 60 * 1000) % 24;
        long diffDays = diff / (24 * 60 * 60 * 1000);

        String time = null;
        if (diffDays > 0) {
            if (diffDays == 1) {
                time = diffDays + "day ago ";
            } else {
                time = diffDays + "days ago ";
            }
        } else {
            if (diffHours > 0) {
                if (diffHours == 1) {
                    time = diffHours + "hr ago";
                } else {
                    time = diffHours + "hrs ago";
                }
            } else {
                if (diffMinutes > 0) {
                    if (diffMinutes == 1) {
                        time = diffMinutes + "min ago";
                    } else {
                        time = diffMinutes + "mins ago";
                    }
                } else {
                    if (diffSeconds > 0) {
                        time = diffSeconds + "secs ago";
                    }
                }

            }

        }
        return time;
    }
}

1

안드로이드의 경우 라비가 말한 것처럼 말하지만 많은 사람들이 복사하여 붙여 넣기를 원 하기 때문에 여기에 있습니다.

  try {
      SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
      Date dt = formatter.parse(date_from_server);
      CharSequence output = DateUtils.getRelativeTimeSpanString (dt.getTime());
      your_textview.setText(output.toString());
    } catch (Exception ex) {
      ex.printStackTrace();
      your_textview.setText("");
    }

시간이 더 많은 사람들을위한 설명

  1. 어딘가에서 데이터를 얻습니다. 먼저 형식을 파악해야합니다.

전의. Wed, 27 Jan 2016 09:32:35 GMT 형식의 서버에서 데이터를 얻습니다. [아마도 그렇지 않습니다]

이것은로 번역

SimpleDateFormat 포맷터 = 새로운 SimpleDateFormat ( "EEE, dd MMM yyyy HH : mm : ss Z");

어떻게 알 수 있습니까? 여기 에서 설명서를 읽으 십시오.

그런 다음 구문 분석 한 후 날짜를 얻습니다. getRelativeTimeSpanString에 넣은 날짜 (추가 매개 변수가 없으면 기본적으로 분으로 설정)

당신은 예외를 얻을 것이다 당신이 파악하지 않은 경우 올바른 구문 분석 문자열 예외 : 같은 뭔가를 문자 5에서 . 문자 5를보고 초기 구문 분석 문자열을 정정하십시오. . 다른 예외가 발생할 수 있습니다. 올바른 수식이 될 때까지이 단계를 반복하십시오.


1
private const val SECOND_MILLIS = 1
private const val MINUTE_MILLIS = 60 * SECOND_MILLIS
private const val HOUR_MILLIS = 60 * MINUTE_MILLIS
private const val DAY_MILLIS = 24 * HOUR_MILLIS

object TimeAgo {

fun timeAgo(time: Int): String {

    val now = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())
    if (time > now || time <= 0) {
        return "in the future"
    }

    val diff = now - time
    return when {
        diff < MINUTE_MILLIS -> "Just now"
        diff < 2 * MINUTE_MILLIS -> "a minute ago"
        diff < 60 * MINUTE_MILLIS -> "${diff / MINUTE_MILLIS} minutes ago"
        diff < 2 * HOUR_MILLIS -> "an hour ago"
        diff < 24 * HOUR_MILLIS -> "${diff / HOUR_MILLIS} hours ago"
        diff < 48 * HOUR_MILLIS -> "yesterday"
        else -> "${diff / DAY_MILLIS} days ago"
    }
}

}

요구

val 문자열 = timeAgo (unixTimeStamp)

코 틀린에서 시간을 갖기 위해


0

여기 내 Java 구현이 있습니다.

    public static String relativeDate(Date date){
    Date now=new Date();
    if(date.before(now)){
    int days_passed=(int) TimeUnit.MILLISECONDS.toDays(now.getTime() - date.getTime());
    if(days_passed>1)return days_passed+" days ago";
    else{
        int hours_passed=(int) TimeUnit.MILLISECONDS.toHours(now.getTime() - date.getTime());
        if(hours_passed>1)return days_passed+" hours ago";
        else{
            int minutes_passed=(int) TimeUnit.MILLISECONDS.toMinutes(now.getTime() - date.getTime());
            if(minutes_passed>1)return minutes_passed+" minutes ago";
            else{
                int seconds_passed=(int) TimeUnit.MILLISECONDS.toSeconds(now.getTime() - date.getTime());
                return seconds_passed +" seconds ago";
            }
        }
    }

    }
    else
    {
        return new SimpleDateFormat("HH:mm:ss MM/dd/yyyy").format(date).toString();
    }
  }

0

그것은 나를 위해 작동

public class TimeDifference {
    int years;
    int months;
    int days;
    int hours;
    int minutes;
    int seconds;
    String differenceString;

    public TimeDifference(@NonNull Date curdate, @NonNull Date olddate) {

        float diff = curdate.getTime() - olddate.getTime();
        if (diff >= 0) {
            int yearDiff = Math.round((diff / (AppConstant.aLong * AppConstant.aFloat)) >= 1 ? (diff / (AppConstant.aLong * AppConstant.aFloat)) : 0);
            if (yearDiff > 0) {
                years = yearDiff;
                setDifferenceString(years + (years == 1 ? " year" : " years") + " ago");
            } else {
                int monthDiff = Math.round((diff / AppConstant.aFloat) >= 1 ? (diff / AppConstant.aFloat) : 0);
                if (monthDiff > 0) {
                    if (monthDiff > AppConstant.ELEVEN) {
                        monthDiff = AppConstant.ELEVEN;
                    }
                    months = monthDiff;
                    setDifferenceString(months + (months == 1 ? " month" : " months") + " ago");
                } else {
                    int dayDiff = Math.round((diff / (AppConstant.bFloat)) >= 1 ? (diff / (AppConstant.bFloat)) : 0);
                    if (dayDiff > 0) {
                        days = dayDiff;
                        if (days == AppConstant.THIRTY) {
                            days = AppConstant.TWENTYNINE;
                        }
                        setDifferenceString(days + (days == 1 ? " day" : " days") + " ago");
                    } else {
                        int hourDiff = Math.round((diff / (AppConstant.cFloat)) >= 1 ? (diff / (AppConstant.cFloat)) : 0);
                        if (hourDiff > 0) {
                            hours = hourDiff;
                            setDifferenceString(hours + (hours == 1 ? " hour" : " hours") + " ago");
                        } else {
                            int minuteDiff = Math.round((diff / (AppConstant.dFloat)) >= 1 ? (diff / (AppConstant.dFloat)) : 0);
                            if (minuteDiff > 0) {
                                minutes = minuteDiff;
                                setDifferenceString(minutes + (minutes == 1 ? " minute" : " minutes") + " ago");
                            } else {
                                int secondDiff = Math.round((diff / (AppConstant.eFloat)) >= 1 ? (diff / (AppConstant.eFloat)) : 0);
                                if (secondDiff > 0) {
                                    seconds = secondDiff;
                                } else {
                                    seconds = 1;
                                }
                                setDifferenceString(seconds + (seconds == 1 ? " second" : " seconds") + " ago");
                            }
                        }
                    }

                }
            }

        } else {
            setDifferenceString("Just now");
        }

    }

    public String getDifferenceString() {
        return differenceString;
    }

    public void setDifferenceString(String differenceString) {
        this.differenceString = differenceString;
    }

    public int getYears() {
        return years;
    }

    public void setYears(int years) {
        this.years = years;
    }

    public int getMonths() {
        return months;
    }

    public void setMonths(int months) {
        this.months = months;
    }

    public int getDays() {
        return days;
    }

    public void setDays(int days) {
        this.days = days;
    }

    public int getHours() {
        return hours;
    }

    public void setHours(int hours) {
        this.hours = hours;
    }

    public int getMinutes() {
        return minutes;
    }

    public void setMinutes(int minutes) {
        this.minutes = minutes;
    }

    public int getSeconds() {
        return seconds;
    }

    public void setSeconds(int seconds) {
        this.seconds = seconds;
    } }

0

이것은 매우 기본적인 스크립트입니다. 즉흥 연주하기 쉽습니다.
결과 : (XXX Hours Ago) 또는 (XX Days Ago / Yesterday / Today)

<span id='hourpost'></span>
,or
<span id='daypost'></span>

<script>
var postTime = new Date('2017/6/9 00:01'); 
var now = new Date();
var difference = now.getTime() - postTime.getTime();
var minutes = Math.round(difference/60000);
var hours = Math.round(minutes/60);
var days = Math.round(hours/24);

var result;
if (days < 1) {
result = "Today";
} else if (days < 2) {
result = "Yesterday";
} else {
result = days + " Days ago";
}

document.getElementById("hourpost").innerHTML = hours + "Hours Ago" ;
document.getElementById("daypost").innerHTML = result ;
</script>

0

Just Now, seconds ago, min ago, hrs ago, days ago, weeks ago, months ago, years ago이 예제에서 수행 한이 날짜 2018-09-05T06:40:46.183Z또는 아래와 같은 다른 날짜를 구문 분석 할 수 있습니다

string.xml 에 아래 값을 추가하십시오.

  <string name="lbl_justnow">Just Now</string>
    <string name="lbl_seconds_ago">seconds ago</string>
    <string name="lbl_min_ago">min ago</string>
    <string name="lbl_mins_ago">mins ago</string>
    <string name="lbl_hr_ago">hr ago</string>
    <string name="lbl_hrs_ago">hrs ago</string>
    <string name="lbl_day_ago">day ago</string>
    <string name="lbl_days_ago">days ago</string>
    <string name="lbl_lstweek_ago">last week</string>
    <string name="lbl_week_ago">weeks ago</string>
    <string name="lbl_onemonth_ago">1 month ago</string>
    <string name="lbl_month_ago">months ago</string>
    <string name="lbl_oneyear_ago" >last year</string>
    <string name="lbl_year_ago" >years ago</string>

자바 코드는 아래에서 시도하십시오

  public String getFormatDate(String postTime1) {
        Calendar cal=Calendar.getInstance();
        Date now=cal.getTime();
        String disTime="";
        try {
            Date postTime;
            //2018-09-05T06:40:46.183Z
            postTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").parse(postTime1);

            long diff=(now.getTime()-postTime.getTime()+18000)/1000;

            //for months
            Calendar calObj = Calendar.getInstance();
            calObj.setTime(postTime);
            int m=calObj.get(Calendar.MONTH);
            calObj.setTime(now);

            SimpleDateFormat monthFormatter = new SimpleDateFormat("MM"); // output month

            int mNow = Integer.parseInt(monthFormatter.format(postTime));

            diff = diff-19800;

            if(diff<15) { //below 15 sec

                disTime = getResources().getString(R.string.lbl_justnow);
            } else if(diff<60) {

                //below 1 min
                disTime= diff+" "+getResources().getString(R.string.lbl_seconds_ago);
            } else if(diff<3600) {//below 1 hr

                // convert min
                long temp=diff/60;

                if(temp==1) {
                    disTime= temp + " " +getResources().getString(R.string.lbl_min_ago);
                } else {
                    disTime = temp  + " " +getResources().getString(R.string.lbl_mins_ago);
                }
            } else if(diff<(24*3600)) {// below 1 day

                // convert hr
                long temp= diff/3600;
                System.out.println("hey temp3:"+temp);
                if(temp==1) {
                    disTime = temp  + " " +getResources().getString(R.string.lbl_hr_ago);
                } else {
                    disTime = temp + " " +getResources().getString(R.string.lbl_hrs_ago);
                }
            } else if(diff<(24*3600*7)) {// below week

                // convert days
                long temp=diff/(3600*24);
                if (temp==1) {
                    //  disTime = "\nyesterday";
                    disTime = temp + " " +getResources().getString(R.string.lbl_day_ago);
                } else {
                    disTime = temp + " " +getResources().getString(R.string.lbl_days_ago);
                }
            } else if(diff<((24*3600*28))) {// below month

                // convert week
                long temp=diff/(3600*24*7);
                if (temp <= 4) {

                    if (temp < 1) {
                        disTime = getResources().getString(R.string.lbl_lstweek_ago);
                    }else{
                        disTime = temp + " " + getResources().getString(R.string.lbl_week_ago);
                    }

                } else {
                    int diffMonth = mNow - m;
                    Log.e("count : ", String.valueOf(diffMonth));
                    disTime = diffMonth + " " + getResources().getString(R.string.lbl_month_ago);
                }
            }else if(diff<((24*3600*365))) {// below year

                // convert month
                long temp=diff/(3600*24*30);

                System.out.println("hey temp2:"+temp);
                if (temp <= 12) {

                    if (temp == 1) {
                        disTime = getResources().getString(R.string.lbl_onemonth_ago);
                    }else{
                        disTime = temp + " " + getResources().getString(R.string.lbl_month_ago);
                    }
                }

            }else if(diff>((24*3600*365))) { // above year

                // convert year
                long temp=diff/(3600*24*30*12);

                System.out.println("hey temp8:"+temp);

                if (temp == 1) {
                    disTime = getResources().getString(R.string.lbl_oneyear_ago);
                }else{
                    disTime = temp + " " + getResources().getString(R.string.lbl_year_ago);
                }
            }

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

        return disTime;
    }

android에서 작업하는 경우 다음을 사용할 수 있습니다. android.text.format.DateUtils.getRelativeTimeSpanString (milliseconds)
Wajid Ali

0

Java의 Library RelativeDateTimeFormatter를 사용할 수 있습니다 .

RelativeDateTimeFormatter fmt = RelativeDateTimeFormatter.getInstance();
 fmt.format(1, Direction.NEXT, RelativeUnit.DAYS); // "in 1 day"
 fmt.format(3, Direction.NEXT, RelativeUnit.DAYS); // "in 3 days"
 fmt.format(3.2, Direction.LAST, RelativeUnit.YEARS); // "3.2 years ago"

 fmt.format(Direction.LAST, AbsoluteUnit.SUNDAY); // "last Sunday"
 fmt.format(Direction.THIS, AbsoluteUnit.SUNDAY); // "this Sunday"
 fmt.format(Direction.NEXT, AbsoluteUnit.SUNDAY); // "next Sunday"
 fmt.format(Direction.PLAIN, AbsoluteUnit.SUNDAY); // "Sunday"

 fmt.format(Direction.LAST, AbsoluteUnit.DAY); // "yesterday"
 fmt.format(Direction.THIS, AbsoluteUnit.DAY); // "today"
 fmt.format(Direction.NEXT, AbsoluteUnit.DAY); // "tomorrow"

 fmt.format(Direction.PLAIN, AbsoluteUnit.NOW); // "now"

1
그것은 Java 라이브러리가 아닌 Android 라이브러리입니다.
Madbreaks

0

Instant, Date 및 DateTimeUtils를 사용하고 있습니다. 데이터베이스에 String 유형으로 저장된 데이터 (날짜)는 Instant로 변환됩니다.

    /*
    This method is to display ago.
    Example: 3 minutes ago.
    I already implement the latest which is including the Instant.
    Convert from String to Instant and then parse to Date.
     */
    public String convertTimeToAgo(String dataDate) {
    //Initialize
    String conversionTime = null;
    String suffix = "Yang Lalu";
    Date pastTime;
    //Parse from String (which is stored as Instant.now().toString()
    //And then convert to become Date
    Instant instant = Instant.parse(dataDate);
    pastTime = DateTimeUtils.toDate(instant);

    //Today date
    Date nowTime = new Date();

    long dateDiff = nowTime.getTime() - pastTime.getTime();
    long second = TimeUnit.MILLISECONDS.toSeconds(dateDiff);
    long minute = TimeUnit.MILLISECONDS.toMinutes(dateDiff);
    long hour = TimeUnit.MILLISECONDS.toHours(dateDiff);
    long day = TimeUnit.MILLISECONDS.toDays(dateDiff);

    if (second < 60) {
        conversionTime = second + " Saat " + suffix;
    } else if (minute < 60) {
        conversionTime = minute + " Minit " + suffix;
    } else if (hour < 24) {
        conversionTime = hour + " Jam " + suffix;
    } else if (day >= 7) {
        if (day > 30) {
            conversionTime = (day / 30) + " Bulan " + suffix;
        } else if (day > 360) {
            conversionTime = (day / 360) + " Tahun " + suffix;
        } else {
            conversionTime = (day / 7) + " Minggu " + suffix;
        }
    } else if (day < 7) {
        conversionTime = day + " Hari " + suffix;
    }
    return conversionTime;
    }

1
java.time 클래스에 의해 몇 년 전에 대체 된 끔찍한 옛날 날짜-시간 클래스를 사용하고 있습니다.
Basil Bourque 2018 년

@BasilBourque 여전히이 작업을 수행하는 최신 방법을 찾을 수 없습니다.
Ticherhaz

@BasilBourque 나는 그것을 이해하기 위해 몇 가지 코드를 추가했다. github.com/ticherhaz/tarikhmasa
Ticherhaz 2016

0

다음 솔루션은 모두 순수한 Java입니다.

옵션 1 : 반올림 없음 및 가장 큰 시간 컨테이너

다음 함수는 최대 시간 컨테이너 만 표시합니다. 예를 들어, 실제 경과 시간이 "1 month 14 days ago"인 경우이 함수는 만 표시 "1 month ago"합니다. 이 기능은 항상 반올림되므로 이에 해당하는 시간은 다음과 "50 days ago"같이 표시됩니다."1 month"

public String formatTimeAgo(long millis) {
        String[] ids = new String[]{"second","minute","hour","day","month","year"};

        long seconds = millis / 1000;
        long minutes = seconds / 60;
        long hours = minutes / 60;
        long days = hours / 24;
        long months = days / 30;
        long years = months / 12;

        ArrayList<Long> times = new ArrayList<>(Arrays.asList(years, months, days, hours, minutes, seconds));

        for(int i = 0; i < times.size(); i++) {
            if(times.get(i) != 0) {
                long value = times.get(i).intValue();

                return value + " " + ids[ids.length - 1 - i] + (value == 1 ? "" : "s") + " ago";
            }
        }

        return "0 seconds ago";
    }

옵션 2 : 반올림

간단히 라운드에 당신이 원하는 그렇다면, 당신은 Math.round (...) 문 라운드에 원하는 시간 컨테이너를 포장 50 days하기 위해 2 months수정 long months = days / 30long months = Math.round(days / 30.0)


1
사용 Duration내 답변에to…Part 표시된 것처럼 해당 메소드 와 함께 하는 것이 훨씬 쉽습니다 .
Basil Bourque

0

여기 내 테스트 사례가 도움이되기를 바랍니다.

    val currentCalendar = Calendar.getInstance()
    currentCalendar.set(2019, 6, 2, 5, 31, 0)

    val targetCalendar = Calendar.getInstance()
    targetCalendar.set(2019, 6, 2, 5, 30, 0)

    val diffTs = currentCalendar.timeInMillis - targetCalendar.timeInMillis
    val diffMins = TimeUnit.MILLISECONDS.toMinutes(diffTs)
    val diffHours = TimeUnit.MILLISECONDS.toHours(diffTs)
    val diffDays = TimeUnit.MILLISECONDS.toDays(diffTs)
    val diffWeeks = TimeUnit.MILLISECONDS.toDays(diffTs) / 7
    val diffMonths = TimeUnit.MILLISECONDS.toDays(diffTs) / 30
    val diffYears = TimeUnit.MILLISECONDS.toDays(diffTs) / 365

    val newTs = when {
        diffYears >= 1 -> "Years $diffYears"
        diffMonths >= 1 -> "Months $diffMonths"
        diffWeeks >= 1 -> "Weeks $diffWeeks"
        diffDays >= 1 -> "Days $diffDays"
        diffHours >= 1 -> "Hours $diffHours"
        diffMins >= 1 -> "Mins $diffMins"
        else -> "now"
    }

1
끔찍한 Calendar클래스는 JSR 310을 채택한 현대 java.time 클래스에 의해 몇 년 전에 대체되었습니다 . 2019
Basil Bourque

당신은 의미 var하지 않았을 것 val입니다.
Basil Bourque

0

getrelativeDateTime의 당신이 WHATSAPP 알림에서 보는 바와 같이 기능은 당신에게 날짜 시간을 줄 것이다.
미래의 상대 날짜 시간을 얻으려면 조건을 추가하십시오. 이것은 Whatsapp 알림과 같은 날짜 시간을 얻기 위해 특별히 만들어졌습니다.

private static String getRelativeDateTime(long date) {
    SimpleDateFormat DateFormat = new SimpleDateFormat("MMM dd, yyyy", Locale.getDefault());
    SimpleDateFormat TimeFormat = new SimpleDateFormat(" hh:mm a", Locale.getDefault());
    long now = Calendar.getInstance().getTimeInMillis();
    long startOfDay = StartOfDay(Calendar.getInstance().getTime());
    String Day = "";
    String Time = "";
    long millSecInADay = 86400000;
    long oneHour = millSecInADay / 24;
    long differenceFromNow = now - date;

    if (date > startOfDay) {
        if (differenceFromNow < (oneHour)) {
            int minute = (int) (differenceFromNow / (60000));
            if (minute == 0) {
                int sec = (int) differenceFromNow / 1000;
                if (sec == 0) {
                    Time = "Just Now";
                } else if (sec == 1) {
                    Time = sec + " second ago";
                } else {
                    Time = sec + " seconds ago";
                }
            } else if (minute == 1) {
                Time = minute + " minute ago";
            } else if (minute < 60) {
                Time = minute + " minutes ago";
            }
        } else {
            Day = "Today, ";
        }
    } else if (date > (startOfDay - millSecInADay)) {
        Day = "Yesterday, ";
    } else if (date > (startOfDay - millSecInADay * 7)) {
        int days = (int) (differenceFromNow / millSecInADay);
        Day = days + " Days ago, ";
    } else {
        Day = DateFormat.format(date);
    }
    if (Time.isEmpty()) {
        Time = TimeFormat.format(date);
    }
    return Day + Time;
}

public static long StartOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    return calendar.getTimeInMillis();
}

기여해 주셔서 감사합니다. 정확히 요청 된 것은 아니지만 누군가가 그것을 사용할 수 있습니다. 그래도 누군가 나 다른 사람이 사용 SimpleDateFormat하고 싶지 않아야합니다 Calendar. 이러한 클래스는 제대로 설계되지 않았고 오래되었습니다. 대신 최신 Java 날짜 및 시간 API 인 java.time을 사용하는 답변을 읽으십시오.
Ole VV

0

단순성과 업데이트 된 응답이 부족한 경우 최신 Java 8 이상 버전을 따릅니다.

import java.time.*;
import java.time.temporal.*;

public class Time {
    public static void main(String[] args) {

        System.out.println(LocalTime.now().minus(8, ChronoUnit.MINUTES));
        System.out.println(LocalTime.now().minus(8, ChronoUnit.HOURS));
        System.out.println(LocalDateTime.now().minus(8, ChronoUnit.DAYS));
        System.out.println(LocalDateTime.now().minus(8, ChronoUnit.MONTHS));
    }
}

이것은 날짜 및 시간을 처리하기 위해 과거의 문제를 해결하려고 시도하는 Java Time API를 사용하는 버전입니다.

자바 독

버전 8 https://docs.oracle.com/javase/8/docs/api/index.html?java/time/package-summary.html

버전 11 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/package-summary.html

W3Schools의 튜토리얼 - https://www.w3schools.com/java/java_date.asp

DZone 기사 - https://dzone.com/articles/java-8-date-and-time

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