जावा में "समय पहले" की गणना कैसे करें?


127

रूबी ऑन रेल्स में, एक ऐसी सुविधा है जो आपको किसी भी दिनांक को लेने की अनुमति देती है और प्रिंट करती है कि "बहुत पहले" कैसा था।

उदाहरण के लिए:

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

क्या जावा में ऐसा करने का एक आसान तरीका है?


1
देखें: stackoverflow.com/questions/11/how-do-i-calculate-relative-time यह C # है, लेकिन मुझे यकीन है कि आप इसे थोड़ी परेशानी में बदल सकते हैं।
ब्रैंडन

जवाबों:


177

प्रिटीटाइम लाइब्रेरी पर एक नजर ।

यह उपयोग करने के लिए काफी सरल है:

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.text.format.DateUtilsवर्ग में निर्मित है ।


229
यदि आप Android पर काम कर रहे हैं तो आप इसका उपयोग कर सकते हैं: android.text.format.DateUtils # getRelativeTimeSpanString ()
9

क्या आप कृपया अपने उत्तर में कुछ और विवरण जोड़ सकते हैं, लिंक केवल उत्तर के लिए अच्छा नहीं है।
अजय एस

@Somatik यदि आपको गैर-एंड्रॉइड प्लेटफ़ॉर्म पर इसे प्राप्त करने की आवश्यकता है, तो आप उस क्लास को AOSP पर देख सकते हैं
greg7gkb 22

@ataylor एंड्रॉइड में यह कैसे उपयोग करते हैं ??
हार्दिक परमार

getRelativeTimeSpanString सभी स्थितियों के लिए आदर्श नहीं है और यही कारण है कि मैंने यहां बहुत सारे उदाहरणों के आधार पर अपनी खुद की कक्षा बनाई। नीचे मेरा समाधान देखें: stackoverflow.com/a/37042254/468360
4:16 पर कोड किया

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 है। आपको प्रत्येक समय इकाई से कम करने की आवश्यकता है कि अगली बड़ी समय इकाई (इसे निचले समय इकाई में परिवर्तित करने के बाद) इसे "समय से पहले" उपयोग करने में सक्षम होने के लिए “स्ट्रिंग।
नटिव

@ बेनज - क्या यह सही है? उपरोक्त समाधान? क्योंकि एक समय 12 घंटे के प्रारूप में और दूसरा समय 24 घंटे के प्रारूप में होता है। मुझे मेरी क्वेरी के लिए अपनी प्रतिक्रिया दें। अग्रिम धन्यवाद।
स्विफ्ट

यह गलत है, हालांकि ... प्रत्येक इकाई पहले से ही उल्लेख किए गए प्रत्येक अभिभावक से स्वतंत्र है।
जोनाथन लालबिर्ते

1
एंड्रॉइड आपके लिए करता है यदि आप एंड्रॉइड पर काम कर रहे हैं तो आप इसका उपयोग कर सकते हैं: android.text.format.DateUtils.getRelativeTimeSpanString (मिलीसेकंड)
वाजिद अली

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

बहुत कूल। और अन्य समय इकाइयों जैसे सप्ताह (नों) को जोड़ना आसान है
पिओट्र

1
यह एक अधिक उत्थान के योग्य है। सबसे पहले, किसी भी पुस्तकालय की आवश्यकता नहीं है। यह अभी भी साफ, सुरुचिपूर्ण और बदलने में आसान है।
fangzhzh

छोटे टाइपो: आपके कोड के अंदर आपके "TimeAgo" के बजाय स्थैतिक गुणों "सूचियों" को संदर्भित कर रहे हैं। Lists.times.get (i) TimeAgo.get (i) होना चाहिए ... और इसी तरह
Diogo Gomes

2
थोड़ा सुझाव: उपयोग के .append(temp != 1 ? "s" : "")बजाय .append(temp > 1 ? "s" : "")क्योंकि 0 में sप्रत्यय भी होना चाहिए
बेरकस

1
@ शाजीलअफ़ज़ल हाँ, अवधि पैरामीटर मिलीसेकंड में है लेकिन यह समय के बीच का अंतर है जो निरपेक्ष मूल्य नहीं है। आपको जो समय मिल रहा है वह 1 जनवरी 1970 की तारीख से है जब यूनिक्स टाइमस्टैम्प शुरू हुआ था
रिकार्डो कसाटा

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
         */
    }
}

अधिक @ एक मानव-पठनीय प्रारूप में मिलीसेकंड में एक अवधि प्रारूपित करें


मैं इस के एक संशोधित संस्करण का उपयोग कर समाप्त हुआ। आपके लिए मेरा संशोधन प्रकाशित किया।
डेविड बुविंस

5
डेविड बिल्विन्स, प्रेटीटाइम के बारे में अधिक उदाहरण: 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 दिन पहले बताते हैं।
फीलो

7

अंतर्निहित समाधानों के बारे में :

जावा के पास सापेक्ष समय प्रारूपण के लिए कोई अंतर्निहित समर्थन नहीं है, जावा -8 और इसका नया पैकेज भी नहीं है java.time। यदि आपको केवल अंग्रेजी की आवश्यकता है और इसके बाद कुछ और नहीं तो केवल एक हाथ से बनाया गया समाधान स्वीकार्य हो सकता है - @RealHowTo का उत्तर देखें (हालांकि इसका स्थानीय समय पर तत्काल देरी के अनुवाद के लिए समयक्षेत्र को ध्यान में नहीं रखने के लिए मजबूत नुकसान है इकाइयों!)। वैसे भी, यदि आप विशेष रूप से अन्य स्थानों के लिए घर-निर्मित जटिल वर्कआर्ड्स से बचना चाहते हैं तो आपको बाहरी पुस्तकालय की आवश्यकता है।

बाद के मामले में, मैं अपने पुस्तकालय Time4J (या Android पर Time4A) का उपयोग करने की सलाह देता हूं । यह सबसे बड़ा लचीलापन और सबसे i18n- शक्ति प्रदान करता है । वर्ग net.time4j.PrettyTime के पास printRelativeTime...(...)इस उद्देश्य के लिए सात विधियाँ हैं । समय स्रोत के रूप में एक परीक्षण घड़ी का उपयोग कर उदाहरण:

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 -data मुख्य रूप से नवीनतम CLDR-संस्करण v29 पर आधारित हैं । इस लाइब्रेरी का उपयोग करने के अन्य महत्वपूर्ण कारण बहुवचन नियमों (जो अन्य स्थानों में अंग्रेजी से अक्सर भिन्न होते हैं), संक्षिप्त प्रारूप शैली (उदाहरण के लिए: "1 सेकंड पहले") और समय-समय पर खाते में लेने के लिए अभिव्यंजक तरीके के लिए अच्छा समर्थन है । Time4J इस तरह के विदेशी विवरणों से भी अवगत है, जैसे रिश्तेदार समय की गणना में छलांग सेकंड (वास्तव में महत्वपूर्ण नहीं है लेकिन यह उम्मीद क्षितिज से संबंधित एक संदेश बनाता है)। जावा-8 के साथ संगतताjava.time.Instantया जैसे प्रकारों के लिए आसानी से उपलब्ध रूपांतरण विधियों के कारण मौजूद है java.time.Period

क्या कोई कमियां हैं? केवल दो।

  • पुस्तकालय छोटा नहीं है (इसके बड़े i18n-data भंडार के कारण भी)।
  • एपीआई अच्छी तरह से ज्ञात नहीं है, इसलिए सामुदायिक ज्ञान और समर्थन अभी तक उपलब्ध नहीं है अन्यथा आपूर्ति की गई दस्तावेज बहुत विस्तृत और व्यापक है।

(कॉम्पैक्ट) विकल्प:

यदि आप एक छोटे से समाधान की तलाश करते हैं और इतनी सारी विशेषताओं की आवश्यकता नहीं है और तब i18n-data से संबंधित संभावित गुणवत्ता के मुद्दों को सहन करने के लिए तैयार हैं:

  • मैं ऑस्प्सॉफ्ट / प्रेटीटाइम (वास्तव में 32 भाषाओं के लिए समर्थन का सुझाव देता हूं ) ( java.util.Dateकेवल 34?) केवल काम करने के लिए उपयुक्त है - @ataylor का उत्तर देखें)। उद्योग मानक CLDR (यूनिकोड कंसोर्टियम से) अपनी बड़ी सामुदायिक पृष्ठभूमि के साथ दुर्भाग्य से i18n-data का आधार नहीं है, ताकि डेटा में और वृद्धि या सुधार में थोड़ा समय लग सके ...

  • यदि आप एंड्रॉइड पर हैं, तो सहायक वर्ग android.text.format.DateUtils एक पतला बिल्ट-इन विकल्प है (अन्य टिप्पणियों और उत्तरों को यहां देखें, इस नुकसान के साथ कि इसका वर्षों और महीनों तक कोई समर्थन नहीं है। और मुझे यकीन है कि यह सब है।) बहुत कम लोग इस सहायक वर्ग की एपीआई-शैली को पसंद करते हैं।

  • यदि आप Joda-Time के प्रशंसक हैं, तो आप इसकी कक्षा PeriodFormat (रिलीज़ v2.9.4 में 14 भाषाओं के लिए समर्थन) को देख सकते हैं , दूसरी तरफ: Joda-Time निश्चित रूप से कॉम्पैक्ट नहीं है, इसलिए, मैं यहाँ सिर्फ इसके लिए इसका उल्लेख करता हूं पूर्णता)। यह लाइब्रेरी एक वास्तविक जवाब नहीं है क्योंकि सापेक्ष समय बिल्कुल भी समर्थित नहीं है। आपको कम से कम शाब्दिक रूप से "पहले" संलग्न करने की आवश्यकता होगी (और मैन्युअल रूप से उत्पन्न सूची प्रारूपों से सभी निचली इकाइयों को अलग करना - अजीब)। Time4J या Android-DateUtils के विपरीत, इसमें संक्षिप्त समय के लिए संक्षिप्त या स्वचालित स्विचिंग के लिए कोई विशेष समर्थन नहीं है। प्रिटीटाइम की तरह, यह पूरी तरह से जावा-समुदाय के निजी सदस्यों के अपने i18n-data के अपुष्ट योगदान पर निर्भर है।


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

जावा 8 और बाद में निर्मित जावा.टाइम ढांचे का उपयोग करना ।

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विधियां संपूर्ण अवधि को घंटों की कुल संख्या और मिनटों की कुल संख्या के रूप में रिपोर्ट करती हैं । जावा 8 में कक्षा अजीब तरह से किसी भी तरीकों का अभाव प्रत्येक पाने के लिए भाग घंटे और मिनट और सेकंड की। जावा 9 उन तरीकों लाता है, to…Part
तुलसी बॉर्क


4

यदि आप Android के लिए एक ऐप विकसित कर रहे हैं, तो यह ऐसी सभी आवश्यकताओं के लिए उपयोगिता वर्ग DateUtils प्रदान करता है । DateUtils # getRelativeTimeSpanString () उपयोगिता विधि पर एक नज़र डालें ।

के लिए डॉक्स से

चारसालेंस getRelativeTimeSpanString (लंबे समय, लंबे समय तक, लंबे minResolution)

'अब' के सापेक्ष 'समय' का वर्णन करते हुए एक स्ट्रिंग लौटाता है। अतीत में टाइम स्पैन को "42 मिनट पहले" की तरह स्वरूपित किया जाता है। भविष्य में टाइम स्पैन को "42 मिनट में" की तरह स्वरूपित किया जाता है।

आप अपने समय के रूप में और अब केtimestamp रूप में पारित हो जाएगा । आप कम से कम समयावधि रिपोर्ट करने के लिए निर्दिष्ट कर सकते हैं।System.currentTimeMillis()minResolution

उदाहरण के लिए, अतीत में 3 सेकंड का समय "0 मिनट पहले" के रूप में बताया जाएगा यदि यह MINUTE_IN_ILLILLIS पर सेट है। 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();
    }
}

यह बहुत उपयोगी है, बहुत बहुत धन्यवाद।
हया अक्कड़

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 (मिलीसेकंड)
वाजिद अली

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 अपने वर्तमान डिफ़ॉल्ट समय क्षेत्र को स्पष्ट रूप से लागू करता है। वह डिफ़ॉल्ट किसी भी समय बदल सकता हैरनटाइम (!) के दौरान , इसलिए आपके परिणाम भिन्न हो सकते हैं। एक तर्क के रूप में स्पष्ट रूप से अपने वांछित / अपेक्षित समय क्षेत्र को निर्दिष्ट करने के लिए बेहतर है। यदि महत्वपूर्ण है, तो अपने उपयोगकर्ता के साथ ज़ोन की पुष्टि करें।

के रूप में , या , के प्रारूप में एक उचित समय क्षेत्र नाम निर्दिष्ट करें । कभी इस तरह के रूप में 2-4 पत्र संक्षिप्त नाम का उपयोग या के रूप में वे कर रहे हैं नहीं सच समय क्षेत्र, नहीं मानकीकृत, और यहां तक कि अद्वितीय नहीं (!)।Continent/RegionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTIST

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

आठ दिन, महीने और साल पहले की तारीख को फिर से बनाना।

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 ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date, Calendar, और SimpleDateFormat

अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है

Joda समय परियोजना, अब में रखरखाव मोड , के लिए प्रवास की सलाह है java.time कक्षाएं।

आप अपने डेटाबेस से सीधे java.time वस्तुओं का आदान-प्रदान कर सकते हैं । JDBC 4.2 या उसके बाद के JDBC ड्राइवर का अनुपालन करें । तार की कोई जरूरत नहीं, कोई जरूरत नहींjava.sql.* कक्षाओं ।

Java.time कक्षाएं कहाँ से प्राप्त करें?

ThreeTen-अतिरिक्त परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के संभावित भविष्य के परिवर्धन के लिए एक साबित जमीन है। आप यहाँ कुछ उपयोगी वर्गों जैसे मिल सकता है Interval, YearWeek, YearQuarter, और अधिक


आपको बहुत - बहुत धन्यवाद!
13

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

Android के लिए बिल्कुल वैसे ही जैसे रवि ने कहा, लेकिन चूंकि बहुत से लोग बस उस चीज़ को कॉपी करना चाहते हैं , जो यहाँ है।

  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. आपको कहीं से डेटा मिलता है। सबसे पहले आपको यह प्रारूप करना होगा।

पूर्व। मुझे एक सर्वर से डेटा स्वरूप में मिल जाता है बुध, 27 जनवरी 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"
    }
}

}

कॉल

वैल स्ट्रिंग = टाइमआगो (यूनिक्सटाइमस्टैम्प)

कोटलिन में समय से पहले पाने के लिए


0

यहाँ मेरा जावा कार्यान्वयन है

    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 घंटे एगो), या (XX दिन एगो / कल / आज)

<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 (मिलीसेकंड)
वाजिद अली

0

आप जावा की लाइब्रेरी 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
यह एक Android लाइब्रेरी है, जावा लाइब्रेरी नहीं है।
मादरेक्स

0

मैं झटपट, दिनांक और DateTimeUtils का उपयोग कर रहा हूं। डेटा (दिनांक) जिसे डेटाबेस में स्ट्रिंग के प्रकार में संग्रहीत किया जाता है और फिर तुरंत बन जाता है।

    /*
    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 कक्षाओं द्वारा वर्षों पहले दबा दी गई थीं
तुलसी बॉर्न

@BasilBourque मुझे अभी भी ऐसा करने का नवीनतम तरीका नहीं मिल रहा है।
टिचरज

@BasilBourque मैंने इसे समझने के लिए कुछ कोड जोड़े हैं। github.com/ticherhaz/tarikhmasa
Ticherhaz

0

निम्नलिखित समाधान सभी शुद्ध जावा में हैं:

विकल्प 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 / 30करेंlong months = Math.round(days / 30.0)


1
Durationइसकी to…Partविधियों का उपयोग करना अधिक आसान होगा, जैसा कि मेरे उत्तर में दिखाया गया है ।
तुलसी बोर्कर

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
जेएसआर 310 को अपनाने के साथ Calendarआधुनिक जावा.टाइम कक्षाओं द्वारा वर्षों पहले भयानक वर्ग को दबा दिया गया था । 2019 में खराब सलाह।
तुलसी बॉर्क

आपका मतलब होना चाहिए var, नहीं val
तुलसी बोर्क

0

GetrelativeDateTime समारोह के रूप में आप 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.time को नियोजित कर रहे हैं, आधुनिक जावा तिथि और समय एपीआई।
ओले वीवी

0

सादगी और अद्यतन प्रतिक्रिया की कमी के लिए, हाल ही के जावा 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));
    }
}

यह वह संस्करण है जो जावा टाइम एपीआई का उपयोग करता है जो तारीख और समय से निपटने के लिए अतीत से मुद्दों को हल करने की कोशिश करता है।

जावाडोक

संस्करण 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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.