জাভাতে কীভাবে মিলিসেকেন্ডগুলি "এক্স মিনিট, এক্স সেকেন্ড" এ রূপান্তর করবেন?


571

System.currentTimeMillis()যখন কোনও ব্যবহারকারী আমার প্রোগ্রামে কিছু শুরু করে তখন আমি সময়টি রেকর্ড করতে চাই । যখন তিনি শেষ করেন, আমি চলকটি System.currentTimeMillis()থেকে বর্তমানটি বিয়োগ করব startএবং আমি তাদেরকে মানব পাঠযোগ্য বিন্যাস যেমন "XX ঘন্টা, XX মিনিট, XX সেকেন্ড" বা এমনকি "XX মিনিট, XX সেকেন্ড" ব্যবহার করে সময় অতিবাহিত করতে চাই কারণ তার কাউকে এক ঘন্টা নেওয়ার সম্ভাবনা নেই।

এটি করার সর্বোত্তম উপায় কী?


5
যদি তারা এক ঘণ্টার বেশি সময় নেয় আপনি এখনও এমন কিছু মুদ্রণ করতে পারেন; 90 মিনিট, 53 সেকেন্ড।
পিটার লরি

1
আমার উত্তরটি 6 বছর দেরিতে আসে তবে আমি মনে করি এটি গৃহীতদের
সেবাস্তিয়ান লরবার

উত্তর:


1227

java.util.concurrent.TimeUnitক্লাসটি ব্যবহার করুন :

String.format("%d min, %d sec", 
    TimeUnit.MILLISECONDS.toMinutes(millis),
    TimeUnit.MILLISECONDS.toSeconds(millis) - 
    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
);

দ্রষ্টব্য: TimeUnitজাভা 1.5 স্পেসিফিকেশনের অংশ, তবে toMinutesজাভা 1.6 হিসাবে যুক্ত করা হয়েছিল।

0-9 মানগুলির জন্য একটি অগ্রণী শূন্য যুক্ত করতে, কেবল এটি করুন:

String.format("%02d min, %02d sec", 
    TimeUnit.MILLISECONDS.toMinutes(millis),
    TimeUnit.MILLISECONDS.toSeconds(millis) - 
    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
);

যদি TimeUnitবা toMinutesঅসমর্থিত (যেমন এপিআই সংস্করণ 9 এর আগে অ্যান্ড্রয়েডে), নিম্নলিখিত সমীকরণগুলি ব্যবহার করুন:

int seconds = (int) (milliseconds / 1000) % 60 ;
int minutes = (int) ((milliseconds / (1000*60)) % 60);
int hours   = (int) ((milliseconds / (1000*60*60)) % 24);
//etc...

5
int মাস = (ইনট) ((ভাসমান) দিন / 30.4368499f); int বছর = (int) ((ভাসমান) দিন / 365.242199f);
নাথান শোয়ারম্যান

7
আইডিটি 60 মিনিটের বিয়োগের পরিবর্তে 60 টি মোড ব্যবহার করার পরামর্শ দেয়, এটি আরও পরিষ্কার দেখাচ্ছে। যাইহোক, এটি জানা দরকার যে 1 মিনিট = 60 সেকেন্ড এটি করতে ... =)
আলেকজান্ডারসন

2
@ অ্যান্ড্রেসডিয়েটরিচ সিম্পলডেট ফরমেট সময়ের পার্থক্যের জন্য কাজ করে না কারণ এটি কেবল পর্বের সময় থেকে তারিখ ফেরত দেয়!
মুহাম্মদ বাবর

5
int hours = (int) ((milliseconds / (1000*60*60)) % 24)এটি কাজ করে না! পরিবর্তে এটি এর মতো হওয়া উচিতint hours = (int) (milliseconds / (1000*60*60)) ;
মুহাম্মদ বাবর

5
যদি কেউ ভিডিও ফাইলের জন্য একটি ফর্ম্যাট চায় ( h: মিমি: এসএস ):String.format("%01d:%02d:%02d", hours, minutes, seconds);
কাজি

124

@ সিদ্ধদেবের উত্তরের ভিত্তিতে, আমি একটি ফাংশন লিখেছিলাম যা মিলিসেকেন্ডগুলিকে একটি ফর্ম্যাট স্ট্রিংয়ে রূপান্তর করে:

   /**
     * Convert a millisecond duration to a string format
     * 
     * @param millis A duration to convert to a string form
     * @return A string of the form "X Days Y Hours Z Minutes A Seconds".
     */
    public static String getDurationBreakdown(long millis) {
        if(millis < 0) {
            throw new IllegalArgumentException("Duration must be greater than zero!");
        }

        long days = TimeUnit.MILLISECONDS.toDays(millis);
        millis -= TimeUnit.DAYS.toMillis(days);
        long hours = TimeUnit.MILLISECONDS.toHours(millis);
        millis -= TimeUnit.HOURS.toMillis(hours);
        long minutes = TimeUnit.MILLISECONDS.toMinutes(millis);
        millis -= TimeUnit.MINUTES.toMillis(minutes);
        long seconds = TimeUnit.MILLISECONDS.toSeconds(millis);

        StringBuilder sb = new StringBuilder(64);
        sb.append(days);
        sb.append(" Days ");
        sb.append(hours);
        sb.append(" Hours ");
        sb.append(minutes);
        sb.append(" Minutes ");
        sb.append(seconds);
        sb.append(" Seconds");

        return(sb.toString());
    }

2
এই ধরণের পরিস্থিতি এড়াতে আপনার একা / একাধিকের জন্য সেখানে একটি চেকিং করা উচিত:1 Days 1 Hours 1 Minutes 1 Seconds
ড্যানিয়েল

7
আমরা বিয়োগের পরিবর্তে মডুলাস ফাংশন ব্যবহার করতে পারি: long days = TimeUnit.MILLISECONDS.toDays(millis); long hours = TimeUnit.MILLISECONDS.toHours(millis) % 24; long minutes = TimeUnit.MILLISECONDS.toMinutes(millis) % 60; long seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % 60; long milliseconds = millis % 1000; এবং স্ট্রিং.ফর্ম্যাট পদ্ধতি:return String.format("%d Days %d Hours %d Minutes %d Seconds %d Milliseconds", days, hours, minutes, seconds, milliseconds);
জোসে টেপেডিনো

78
long time = 1536259;

return (new SimpleDateFormat("mm:ss:SSS")).format(new Date(time));

ছাপে:

25: 36: 259


1
আমি উপরের পদ্ধতির সেরাটি পছন্দ করি যদি এর সরলতার জন্য আর কিছু না হয়! যেহেতু আমরা সময় এবং সময়সীমা নিয়ে কাজ করছি আমি সাধারণত জোদা ব্যবহার করি। উদাহরণস্বরূপ যদি আপনার দুটি Duration dur = new Duration(start, end); long millis = dur.getMillis();
ডেটটাইম থাকে

1
জোদা ফর্ম্যাটরগুলি ব্যবহার করার জন্য আমার দুটি উপায় উল্লেখ করা উচিত। আপনার থিমের প্রথম প্রকরণ: DateTimeFormat.forPattern("mm:ss:SSS").print(new DateTime(time)); বা সময়টিকে এমন একটি সময়কালে রূপান্তর করুন যা জোদা ব্যবহার করে স্বয়ংক্রিয়ভাবে মুদ্রণ করা যায় PeriodFormatter। আইএসও কালানুক্রম ব্যতীত অন্য কোনও রূপান্তরটির যথার্থতা হারাতে পারে। ধরুন ভেরিয়েবল দ্বারা প্রতিনিধিত্ব করা একটি সময়কাল durationPeriod period = duration.toPeriod().normalizedStandard(PeriodType.time()); PeriodFormat.getDefault().print(period)) আউটপুট দুর্দান্ত: 1 সেকেন্ড এবং 581 মিলিসেকেন্ড, উপরের মূল প্রশ্নের উত্তর দেওয়া।
টেকট্রিপ

2
কিছুটা দেরীতে এখানে :) তবে আপনার আসল টাইমজোন না থাকলে আপনার এখানে সরলডেটফর্ম্যাট.সেটটাইমজোন (টাইমজোন.সেটটাইমজোন ("জিএমটি")) লাগানোর দরকার নেই?
ওলে সাদার্সট্রাম

@ ওলেসডারসট্রম এখানে টাইমজোন নিয়ে আসলেই একটি সমস্যা আছে। তবে এটি GMT বা UTC এ সেট করার ফলে সমস্ত সময়কালের জন্য 1 ঘন্টার চেয়ে কম সময়ের জন্য 0 এর পরিবর্তে 12 ভাগ করা উচিত।
এপিসোডেক্স

2
টাইমজোন এখানে একমাত্র সমস্যা নয় ... এই উত্তরটি বিভ্রান্তিমূলক এবং জাভা newbies গুরুতরভাবে বিভ্রান্ত করতে পারে। এমনকি অপ্রয়োজনীয় বাইরের বন্ধনীগুলি উপেক্ষা করে, ওপি জিজ্ঞাসা করেছিল যে কীভাবে একটি সময়কাল উপস্থাপন করতে হবে (সময়ে দুটি পয়েন্টের মধ্যে পার্থক্য, এমএসে পরিমাপ করা হয়)। সেই সময়কালটিকে "সময়" বলা এবং এটির 1 টি ছোট ছোট আকারের ফর্ম্যাট করার স্বার্থে 1970 এর 1 জানুয়ারি থেকে এটি অফসেট হিসাবে গণ্য করা ঠিক ... ভুল ইমো। আরও কি, খুব একই পদ্ধতির 3 বছর আগে এই উত্তর দ্বারা ইতিমধ্যে পরামর্শ দেওয়া হয়েছিল (টাইমজোন সমস্যা সম্পর্কে আরও বিশদ জন্য সেখানে মন্তব্য দেখুন)।
আমোজ এম কার্পেন্টার

36

আহ ... এক সেকেন্ডে কত মিলিসেকেন্ড? আর এক মিনিটে? বিভাগ যে হার্ড না।

int seconds = (int) ((milliseconds / 1000) % 60);
int minutes = (int) ((milliseconds / 1000) / 60);

ঘন্টা, দিন, সপ্তাহ, মাস, বছর, দশক, যাই হোক না কেন এটির মতো চালিয়ে যান।


2
প্রকৃতপক্ষে, এক ঘণ্টার বেশি সময় ধরে যেকোন কিছু করার জন্য এটি ভাল ধারণা নয় যেহেতু দিবালোকের সঞ্চয়ের সময় (২৩ বা ২৪ ঘন্টার দিন) বা লিপ বছর জড়িত থাকে তখন ফলাফলগুলি ভুল / অনিশ্চিত হতে পারে। যদি আমি "এক্স 1 বছর 1 মাসের মধ্যে ঘটবে" পড়ে থাকে তবে আমি এটি একই তারিখ এবং সময় আশা করব।
মাইকেল বর্গওয়ার্ট

5
সিস্টেম.কোর্নটাইমমিলিস () ডিএসটি-র বিরুদ্ধে প্রতিরোধক তাই এটি অতিরিক্ত বা গায়েবিহীন ঘন্টা দ্বারা বিভ্রান্ত হবে না। যদি আপনাকে দুটি নির্দিষ্ট তারিখের মধ্যে পার্থক্যটি দেখাতে হয় তবে আপনি নির্ধারিত সময়ের সাথে তারিখের অবজেক্টগুলি তৈরি করা ভাল এবং সেই দুটিয়ের মধ্যে পার্থক্য দেখানো ভাল।
বোম্বে

1
কয়েক সপ্তাহ বাদে এটি অপরিজ্ঞাত, যেহেতু মাসের দৈর্ঘ্য পরিবর্তনশীল। সুতরাং প্রকৃতপক্ষে, আপনার একটি নির্দিষ্ট সময়ের রেফারেন্সের তুলনায় গণনা করা দরকার।
ফিলিহো

31

জাভা 8 এ জাভা.টাইম প্যাকেজ ব্যবহার করা :

Instant start = Instant.now();
Thread.sleep(63553);
Instant end = Instant.now();
System.out.println(Duration.between(start, end));

আউটপুট আইএসও 8601 সময়কাল বিন্যাসে রয়েছে : PT1M3.553S(1 মিনিট এবং 3.553 সেকেন্ড)।



1
(অ্যান্ড্রয়েড) এপিআই স্তরের 26 টি প্রয়োজনীয়
কোথাও কোথাও

1
@ সোমেনসোমহোয়ারস এন্ড্রয়েডের জন্য এপিআই স্তরের 26 অধীনে ব্যাকপোর্টটি ব্যবহার করুন, অ্যান্ড্রয়েড প্রকল্পে থ্রিটেনএবিপি কীভাবে ব্যবহার করবেন তা দেখুন ।
ওলে ভিভি

1
দারুণ :) :) হেড-আপের জন্য ধন্যবাদ!
কেউ আবার কোথাও

27

আমি কেবলমাত্র তার জন্য অতিরিক্ত নির্ভরতা টানব না (বিভাজন এতটা কঠিন নয়, সর্বোপরি) তবে আপনি যদি কমন্স ল্যাং যেভাবেই ব্যবহার করছেন তবে সেখানে ইউটিগুলি রয়েছে

ব্যবহারের উদাহরণ ( এখান থেকে অভিযোজিত ):

import org.apache.commons.lang3.time.DurationFormatUtils

public String getAge(long value) {
    long currentTime = System.currentTimeMillis();
    long age = currentTime - value;
    String ageString = DurationFormatUtils.formatDuration(age, "d") + "d";
    if ("0d".equals(ageString)) {
        ageString = DurationFormatUtils.formatDuration(age, "H") + "h";
        if ("0h".equals(ageString)) {
            ageString = DurationFormatUtils.formatDuration(age, "m") + "m";
            if ("0m".equals(ageString)) {
                ageString = DurationFormatUtils.formatDuration(age, "s") + "s";
                if ("0s".equals(ageString)) {
                    ageString = age + "ms";
                }
            }
        }
    }
    return ageString;
}   

উদাহরণ:

long lastTime = System.currentTimeMillis() - 2000;
System.out.println("Elapsed time: " + getAge(lastTime)); 

//Output: 2s

দ্রষ্টব্য : দুটি লোকালডেটটাইম অবজেক্ট থেকে মিলিস পেতে আপনি ব্যবহার করতে পারেন:

long age = ChronoUnit.MILLIS.between(initTime, LocalDateTime.now())

1
দুর্দান্ত, আমি কেবল নিজেকে জিজ্ঞাসা করছিলাম যে কোনও শক্তিশালী পাঠাগার রয়েছে যাতে এই ধরণের জিনিস অন্তর্ভুক্ত থাকে।
লাজিক

যেহেতু একটি লিঙ্কটি সাধারণত খুব কার্যকর না হয়, আমি কীভাবে এটি ব্যবহার করতে পারি তার একটি উদাহরণ যুক্ত করেছি।
Lepe

26

হয় হাত বিভাগ, বা সরলডেটফর্ম্যাট এপিআই ব্যবহার করুন ।

long start = System.currentTimeMillis();
// do your work...
long elapsed = System.currentTimeMillis() - start;
DateFormat df = new SimpleDateFormat("HH 'hours', mm 'mins,' ss 'seconds'");
df.setTimeZone(TimeZone.getTimeZone("GMT+0"));
System.out.println(df.format(new Date(elapsed)));

বোম্বে সম্পাদনা করুন : মন্তব্যগুলিতে প্রদর্শিত হয়েছে যে এই পদ্ধতিটি কেবলমাত্র ছোট সময়সীমার জন্য কাজ করে (অর্থাত্ একটি দিনের চেয়ে কম)।


কি দারুন. এটি একটি মন্দ, সময় অঞ্চল নির্ভর হ্যাক। আপনার যখন টাইমজোন অফসেট হবে যা 60 মিনিটের একাধিক নয় (এবং আমাদের কাছে বিশ্বের কয়েক মিনিটের 30 মিনিটের অফসেট টাইমসোন রয়েছে) তখন নির্দয়ভাবে ভেঙে যায়।
বোম্বে

এছাড়াও, আপনি ফর্ম্যাট স্ট্রিংয়ের মধ্যে ঘন্টা অন্তর্ভুক্ত করার সাথে সাথে ঠিক একই কারণে খারাপ হয়ে যাবে এবং একই কারণে GMT + 0 এ নেই।
বোম্বে

আমরা করি? সত্যি? কোথায়? আপনাকে সন্দেহ করা নয়, এর আগে এর আগে কখনও শুনিনি - বিবেচনা করার জন্য কিছু নতুন ক্ষতি ;-)
ট্রেব

হ্যাঁ. উইকিপিডিয়ায় "টাইম জোনের তালিকা" পরীক্ষা করুন, যেমন নেপাল GMT + 05: 45 এ রয়েছে।
বোম্বে

2
ক্যাড্রিয়ান, এখন এটি কেবল এক দিনেরও কম সময়ের জন্য কাজ করবে। অন্তর্ভুক্ত সহ ঘন্টা 0 এবং 23 এর মধ্যে থাকবে।
বোম্বে

21

আপনি যেমন: HH: মিমি: এসএস ফর্ম্যাট করতে চান তবে আরও তথ্য যুক্ত করতে

0 <= এইচএইচ <= অসীম

0 <= মিমি <60

0 <= ss <60

এটা ব্যবহার কর:

int h = (int) ((startTimeInMillis / 1000) / 3600);
int m = (int) (((startTimeInMillis / 1000) / 60) % 60);
int s = (int) ((startTimeInMillis / 1000) % 60);

আমি এখনই এই সমস্যাটি পেয়েছি এবং এটি বুঝতে পেরেছি


1
এখানে সেরা উত্তর। সবাই কেন এত জটিল জিনিস তৈরি করতে চায়? এটি সহজ গণিত, ভাবেন।
ল্যাম্বার্ট

11

আমি মনে করি সবচেয়ে ভাল উপায়:

String.format("%d min, %d sec", 
    TimeUnit.MILLISECONDS.toSeconds(length)/60,
    TimeUnit.MILLISECONDS.toSeconds(length) % 60 );

মিনিটের জন্য আপনি TimeUnit.MILLISECONDS.toMinutes (দৈর্ঘ্য) ব্যবহার করতে পারেন
বিশিষ্ট

11

সংক্ষিপ্ত সমাধান:

এখানে সম্ভবত সংক্ষিপ্ততম যা সময় অঞ্চলগুলির সাথেও ডিল করে।

System.out.printf("%tT", millis-TimeZone.getDefault().getRawOffset());

উদাহরণস্বরূপ কোন ফলাফল:

00:18:32

ব্যাখ্যা:

%tT২৪ ঘন্টা ঘড়ির জন্য ফর্ম্যাট করা সময় %tH:%tM:%tS

%tTলম্বা ইনপুট হিসাবে গ্রহণ করে, তাই এটি তৈরি করার দরকার নেই Dateprintf()কেবলমাত্র মিলি সেকেন্ডে উল্লিখিত সময়টি মুদ্রণ করবে, তবে বর্তমান সময় অঞ্চলে তাই বর্তমান সময় অঞ্চলের কাঁচা অফসেটটি বিয়োগ করতে হবে যাতে 0 মিলি সেকেন্ড 0 ঘন্টা হবে এবং বর্তমান সময়ের অঞ্চলের সময় অফসেট মান নয়।

নোট # 1: ফলাফল হিসাবে আপনার যদি প্রয়োজন হয় তবে আপনি Stringএটি এটি পেতে পারেন:

String t = String.format("%tT", millis-TimeZone.getDefault().getRawOffset());

নোট # 2:millis দিনের তুলনায় আউটপুট অন্তর্ভুক্ত না হওয়ায় এটি কেবলমাত্র এক দিনের চেয়ে কম হলে সঠিক ফলাফল দেয় ।


এটি এমন দুর্দান্ত শর্ট কাট, তবে আমি যখন এটি ব্যবহার করি তখন আমি প্রত্যাশিত ফলাফল পাই না। সুতরাং আমার কাছে রয়েছে: long millis = 8398;এবং যখন আমি তা String.format("%tT", millis)আমার আউটপুটে পাস করি তখন 19:00:08। 19 কোথা থেকে আসে?
Nelda.techspiress

1
@ নেল্ডা.টেকস্পাইসর এটি আপনার টাইমজোনটির অফসেট। আপনাকে TimeZone.getDefault().getRawOffset()এটি থেকে বিয়োগ করতে হবে, উত্তরে ঠিক যেমনটি লেখা হয়েছে:String.format("%tT", millis-TimeZone.getDefault().getRawOffset())
আইকজা

যে এটি যত্ন নেন. স্পষ্ট করার জন্য আপনাকে ধন্যবাদ।
Nelda.techspiress

8

Joda-টাইম

জোদা-সময় ব্যবহার :

DateTime startTime = new DateTime();

// do something

DateTime endTime = new DateTime();
Duration duration = new Duration(startTime, endTime);
Period period = duration.toPeriod().normalizedStandard(PeriodType.time());
System.out.println(PeriodFormat.getDefault().print(period));

1
PeriodFormatশেষ লাইনে এটির দরকার নেই । ডিফল্টরূপে Period::toStringএকটি আইএসও 8601 সময়কাল স্ট্রিংটি পেতে কেবল কল করুন ।
তুলিল বাউরক

8

@ ব্রেন্ট-ন্যাশ অবদানের পুনর্বিবেচনা, আমরা বিয়োগের পরিবর্তে মডুলাস ফাংশন ব্যবহার করতে পারি এবং ফলাফলের স্ট্রিংয়ের জন্য স্ট্রিং.ফর্ম্যাট পদ্ধতি ব্যবহার করতে পারি:

  /**
   * Convert a millisecond duration to a string format
   * 
   * @param millis A duration to convert to a string form
   * @return A string of the form "X Days Y Hours Z Minutes A Seconds B Milliseconds".
   */
   public static String getDurationBreakdown(long millis) {
       if (millis < 0) {
          throw new IllegalArgumentException("Duration must be greater than zero!");
       }

       long days = TimeUnit.MILLISECONDS.toDays(millis);
       long hours = TimeUnit.MILLISECONDS.toHours(millis) % 24;
       long minutes = TimeUnit.MILLISECONDS.toMinutes(millis) % 60;
       long seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % 60;
       long milliseconds = millis % 1000;

       return String.format("%d Days %d Hours %d Minutes %d Seconds %d Milliseconds",
                            days, hours, minutes, seconds, milliseconds);
   }

6

Android 9 এর নীচে API 9 এর জন্য

(String.format("%d hr %d min, %d sec", millis/(1000*60*60), (millis%(1000*60*60))/(1000*60), ((millis%(1000*60*60))%(1000*60))/1000)) 

5

ছোট সময়ের জন্য, এক ঘণ্টারও কম সময়, আমি পছন্দ করি:

long millis = ...

System.out.printf("%1$TM:%1$TS", millis);
// or
String str = String.format("%1$TM:%1$TS", millis);

দীর্ঘ বিরতি জন্য:

private static final long HOUR = TimeUnit.HOURS.toMillis(1);
...
if (millis < HOUR) {
    System.out.printf("%1$TM:%1$TS%n", millis);
} else {
    System.out.printf("%d:%2$TM:%2$TS%n", millis / HOUR, millis % HOUR);
}

এটি একটি মূল্যবান ইঙ্গিত, জাভা ফরম্যাটার এপিআই ( ডকস.অরাকল . com / javase/8 / docs / api / java / util / Formatter.html ) এর সাথে তারিখ এবং সময়ের জন্য এ জাতীয় অনেক সম্ভাবনা রয়েছে ! আপনার অন্য শর্তের ফলাফলও থাকতে পারে: System.out.printf ("% 1 $ tH:% 1 $ tM:% 1 $ tS% n", মিলিস); বা এমনকি System.out.printf ("% 1 $ tT% n", মিলিস);
হোসে টেপেডিনো

@ জোসেপেপিডিনো তবে আপনি কি জানেন যে %tH কেবল 0 থেকে 23 ঘন্টা পর্যন্ত প্রদর্শিত হয়? তার মানে তাদের উদাহরণস্বরূপ 24 ঘন্টার প্রদর্শন করা হবে যেমন 00, 25 ঘণ্টা হিসাবে 01... একই জন্য বৈধ %tT- দিন চুপি চুপি পরিত্যাগ করা হবে। অবশ্যই,
দিনগুলিও

আমি দেখছি ... এটি কেবলমাত্র এক দিনের চেয়ে কম সময়ের জন্য (24 ঘন্টা) কাজ করবে। ধন্যবাদ.
হোসে টেপেডিনো

5

আমার সাধারণ গণনা:

String millisecToTime(int millisec) {
    int sec = millisec/1000;
    int second = sec % 60;
    int minute = sec / 60;
    if (minute >= 60) {
        int hour = minute / 60;
        minute %= 60;
        return hour + ":" + (minute < 10 ? "0" + minute : minute) + ":" + (second < 10 ? "0" + second : second);
    }
    return minute + ":" + (second < 10 ? "0" + second : second);
}

শুভ কোডিং :)


আমি মনে করি যে এই ক্রিয়াকলাপের জন্য দীর্ঘ সময় আরও উপযুক্ত is
এপ্রোডান

এটি সঠিক নয়, আপনি কি আউটপুট পরীক্ষা করেছেন?
জর্জেসিস

4

এখানে ব্রেন্ট ন্যাশ উত্তরের উপর ভিত্তি করে একটি উত্তর দেওয়া হয়েছে, আশা করি এটি সাহায্য করে!

public static String getDurationBreakdown(long millis)
{
    String[] units = {" Days ", " Hours ", " Minutes ", " Seconds "};
    Long[] values = new Long[units.length];
    if(millis < 0)
    {
        throw new IllegalArgumentException("Duration must be greater than zero!");
    }

    values[0] = TimeUnit.MILLISECONDS.toDays(millis);
    millis -= TimeUnit.DAYS.toMillis(values[0]);
    values[1] = TimeUnit.MILLISECONDS.toHours(millis);
    millis -= TimeUnit.HOURS.toMillis(values[1]);
    values[2] = TimeUnit.MILLISECONDS.toMinutes(millis);
    millis -= TimeUnit.MINUTES.toMillis(values[2]);
    values[3] = TimeUnit.MILLISECONDS.toSeconds(millis);

    StringBuilder sb = new StringBuilder(64);
    boolean startPrinting = false;
    for(int i = 0; i < units.length; i++){
        if( !startPrinting && values[i] != 0)
            startPrinting = true;
        if(startPrinting){
            sb.append(values[i]);
            sb.append(units[i]);
        }
    }

    return(sb.toString());
}

4
    long startTime = System.currentTimeMillis();
    // do your work...
    long endTime=System.currentTimeMillis();
    long diff=endTime-startTime;       
    long hours=TimeUnit.MILLISECONDS.toHours(diff);
    diff=diff-(hours*60*60*1000);
    long min=TimeUnit.MILLISECONDS.toMinutes(diff);
    diff=diff-(min*60*1000);
    long seconds=TimeUnit.MILLISECONDS.toSeconds(diff);
    //hour, min and seconds variables contains the time elapsed on your work

3
Line লাইনে সূত্রটি ভুল। diff=diff-(hours*60*1000);হওয়া উচিত diff=diff-(hours*60*60*1000);। আমি এটি সম্পাদনা করার চেষ্টা করেছি কিন্তু স্ট্যাকওভারফ্লোর বিরক্তিকর সম্পাদনা নীতি বলে যে এটি সম্পাদনার জন্য পর্যাপ্ত অক্ষর নয়।
quux00

4

প্রথমত, System.currentTimeMillis()এবং Instant.now()সময় নির্ধারণের জন্য আদর্শ নয়। তারা উভয় প্রাচীর-ঘড়ির সময় সম্পর্কে জানায়, যা কম্পিউটার সুনির্দিষ্টভাবে জানে না, এবং যা অনিচ্ছাকৃতভাবে চলতে পারে, সহ পিছনে যেতে পারে যদি উদাহরণস্বরূপ এনটিপি ডিমন সিস্টেমের সময়টিকে সংশোধন করে। যদি আপনার সময়টি কোনও একক মেশিনে ঘটে তবে আপনার পরিবর্তে System.nanoTime () ব্যবহার করা উচিত ।

দ্বিতীয়ত, জাভা 8 থেকে জাভা.টাইম.কালীন সময়কাল উপস্থাপনের সেরা উপায়:

long start = System.nanoTime();
// do things...
long end = System.nanoTime();
Duration duration = Duration.ofNanos(end - start);
System.out.println(duration); // Prints "PT18M19.511627776S"
System.out.printf("%d Hours %d Minutes %d Seconds%n",
        duration.toHours(), duration.toMinutes() % 60, duration.getSeconds() % 60);
// prints "0 Hours 18 Minutes 19 Seconds"

3

যদি আপনি জানেন যে সময়ের পার্থক্যটি এক ঘন্টারও কম হবে, তবে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

    Calendar c1 = Calendar.getInstance();
    Calendar c2 = Calendar.getInstance();

    c2.add(Calendar.MINUTE, 51);

    long diff = c2.getTimeInMillis() - c1.getTimeInMillis();

    c2.set(Calendar.MINUTE, 0);
    c2.set(Calendar.HOUR, 0);
    c2.set(Calendar.SECOND, 0);

    DateFormat df = new SimpleDateFormat("mm:ss");
    long diff1 = c2.getTimeInMillis() + diff;
    System.out.println(df.format(new Date(diff1)));

এটি ফলাফল হবে: 51:00


3

এই উত্তরটি উপরের কয়েকটি উত্তরের অনুরূপ। তবে আমি অনুভব করি যে এটি উপকারী হবে কারণ অন্যান্য উত্তরের মতো এটি কোনও অতিরিক্ত কমা বা সাদা স্থান সরিয়ে ফেলবে এবং সংক্ষিপ্তকরণ পরিচালনা করবে।

/**
 * Converts milliseconds to "x days, x hours, x mins, x secs"
 * 
 * @param millis
 *            The milliseconds
 * @param longFormat
 *            {@code true} to use "seconds" and "minutes" instead of "secs" and "mins"
 * @return A string representing how long in days/hours/minutes/seconds millis is.
 */
public static String millisToString(long millis, boolean longFormat) {
    if (millis < 1000) {
        return String.format("0 %s", longFormat ? "seconds" : "secs");
    }
    String[] units = {
            "day", "hour", longFormat ? "minute" : "min", longFormat ? "second" : "sec"
    };
    long[] times = new long[4];
    times[0] = TimeUnit.DAYS.convert(millis, TimeUnit.MILLISECONDS);
    millis -= TimeUnit.MILLISECONDS.convert(times[0], TimeUnit.DAYS);
    times[1] = TimeUnit.HOURS.convert(millis, TimeUnit.MILLISECONDS);
    millis -= TimeUnit.MILLISECONDS.convert(times[1], TimeUnit.HOURS);
    times[2] = TimeUnit.MINUTES.convert(millis, TimeUnit.MILLISECONDS);
    millis -= TimeUnit.MILLISECONDS.convert(times[2], TimeUnit.MINUTES);
    times[3] = TimeUnit.SECONDS.convert(millis, TimeUnit.MILLISECONDS);
    StringBuilder s = new StringBuilder();
    for (int i = 0; i < 4; i++) {
        if (times[i] > 0) {
            s.append(String.format("%d %s%s, ", times[i], units[i], times[i] == 1 ? "" : "s"));
        }
    }
    return s.toString().substring(0, s.length() - 2);
}

/**
 * Converts milliseconds to "x days, x hours, x mins, x secs"
 * 
 * @param millis
 *            The milliseconds
 * @return A string representing how long in days/hours/mins/secs millis is.
 */
public static String millisToString(long millis) {
    return millisToString(millis, false);
}

3

একটি সমস্যা আছে. যখন মিলিসেকেন্ডগুলি 59999 হয়, আসলে এটি 1 মিনিট তবে এটি 59 সেকেন্ড হিসাবে গণনা করা হবে এবং 999 মিলিসেকেন্ড হারিয়ে গেছে।

পূর্ববর্তী উত্তরের উপর ভিত্তি করে এখানে একটি পরিবর্তিত সংস্করণ দেওয়া হয়েছে, যা এই ক্ষতির সমাধান করতে পারে:

public static String formatTime(long millis) {
    long seconds = Math.round((double) millis / 1000);
    long hours = TimeUnit.SECONDS.toHours(seconds);
    if (hours > 0)
        seconds -= TimeUnit.HOURS.toSeconds(hours);
    long minutes = seconds > 0 ? TimeUnit.SECONDS.toMinutes(seconds) : 0;
    if (minutes > 0)
        seconds -= TimeUnit.MINUTES.toSeconds(minutes);
    return hours > 0 ? String.format("%02d:%02d:%02d", hours, minutes, seconds) : String.format("%02d:%02d", minutes, seconds);
}

2

জাভা 9 এ এটি আরও সহজ:

    Duration elapsedTime = Duration.ofMillis(millisDiff );
    String humanReadableElapsedTime = String.format(
            "%d hours, %d mins, %d seconds",
            elapsedTime.toHours(),
            elapsedTime.toMinutesPart(),
            elapsedTime.toSecondsPart());

এটি এর মতো একটি স্ট্রিং তৈরি করে 0 hours, 39 mins, 9 seconds

আপনি যদি বিন্যাস করার আগে পুরো সেকেন্ডে গোল করতে চান:

    elapsedTime = elapsedTime.plusMillis(500).truncatedTo(ChronoUnit.SECONDS);

সময়টি যদি 0 হয় তবে তাদের বাইরে রাখুন:

    long hours = elapsedTime.toHours();
    String humanReadableElapsedTime;
    if (hours == 0) {
        humanReadableElapsedTime = String.format(
                "%d mins, %d seconds",
                elapsedTime.toMinutesPart(),
                elapsedTime.toSecondsPart());

    } else {
        humanReadableElapsedTime = String.format(
                "%d hours, %d mins, %d seconds",
                hours,
                elapsedTime.toMinutesPart(),
                elapsedTime.toSecondsPart());
    }

এখন আমরা উদাহরণস্বরূপ থাকতে পারে 39 mins, 9 seconds

অগ্রণী শূন্যের সাথে কয়েক মিনিট এবং সেকেন্ড মুদ্রণের জন্য এগুলি সর্বদা দুটি অঙ্ক করা যায়, কেবলমাত্র 02প্রাসঙ্গিক ফর্ম্যাট স্পেসিফায়ারগুলিতে সন্নিবেশ করুন :

    String humanReadableElapsedTime = String.format(
            "%d hours, %02d mins, %02d seconds",
            elapsedTime.toHours(),
            elapsedTime.toMinutesPart(),
            elapsedTime.toSecondsPart());

এখন আমরা উদাহরণস্বরূপ থাকতে পারে 0 hours, 39 mins, 09 seconds


পূর্ববর্তী সংখ্যা 0 হলে ঘন্টা / মিনিট / সেকেন্ড সরাতে কোনও বিন্যাস? আমি বলতে চাইছি এটি অন্য শর্তের সাথে অর্জনযোগ্য, তবে এই জাতীয় স্ট্রিং ফর্ম্যাটিং বা কাছের কিছু অস্তিত্বের কী আছে, কোনও আছে কি?
ফরিদ

1
না, দুঃখিত, @ ফরিড, আপনার দরকার আছে if- elseসেখানে।
ওলে ভিভি

1

সঠিক স্ট্রিংয়ের জন্য ("1 ঘন্টা, 3 সেকস", "3 মিনিট" তবে "0 ঘন্টা, 0 মিনিট, 3 সেকেন্ড" নয়) আমি এই কোডটি লিখি:

int seconds = (int)(millis / 1000) % 60 ;
int minutes = (int)((millis / (1000*60)) % 60);
int hours = (int)((millis / (1000*60*60)) % 24);
int days = (int)((millis / (1000*60*60*24)) % 365);
int years = (int)(millis / 1000*60*60*24*365);

ArrayList<String> timeArray = new ArrayList<String>();

if(years > 0)   
    timeArray.add(String.valueOf(years)   + "y");

if(days > 0)    
    timeArray.add(String.valueOf(days) + "d");

if(hours>0)   
    timeArray.add(String.valueOf(hours) + "h");

if(minutes>0) 
    timeArray.add(String.valueOf(minutes) + "min");

if(seconds>0) 
    timeArray.add(String.valueOf(seconds) + "sec");

String time = "";
for (int i = 0; i < timeArray.size(); i++) 
{
    time = time + timeArray.get(i);
    if (i != timeArray.size() - 1)
        time = time + ", ";
}

if (time == "")
  time = "0 sec";

1

আমি @ মাইকিউএলএলএসকি'র উত্তরটি সংশোধন করেছি এবং প্লুরাইজেশন সমর্থন যুক্ত করেছি। আমি কয়েক সেকেন্ড সময় নিয়েছিলাম কারণ আমার তাদের প্রয়োজন হয়নি, যদিও আপনার প্রয়োজন হলে এটি পুনরায় যুক্ত করতে নির্দ্বিধায়।

public static String intervalToHumanReadableTime(int intervalMins) {

    if(intervalMins <= 0) {
        return "0";
    } else {

        long intervalMs = intervalMins * 60 * 1000;

        long days = TimeUnit.MILLISECONDS.toDays(intervalMs);
        intervalMs -= TimeUnit.DAYS.toMillis(days);
        long hours = TimeUnit.MILLISECONDS.toHours(intervalMs);
        intervalMs -= TimeUnit.HOURS.toMillis(hours);
        long minutes = TimeUnit.MILLISECONDS.toMinutes(intervalMs);

        StringBuilder sb = new StringBuilder(12);

        if (days >= 1) {
            sb.append(days).append(" day").append(pluralize(days)).append(", ");
        }

        if (hours >= 1) {
            sb.append(hours).append(" hour").append(pluralize(hours)).append(", ");
        }

        if (minutes >= 1) {
            sb.append(minutes).append(" minute").append(pluralize(minutes));
        } else {
            sb.delete(sb.length()-2, sb.length()-1);
        }

        return(sb.toString());          

    }

}

public static String pluralize(long val) {
    return (Math.round(val) > 1 ? "s" : "");
}

int intervalMins বনাম long millis
কুইকিনেট

1

আমি এটি অন্য উত্তরে কভার করেছি তবে আপনি এটি করতে পারেন:

public static Map<TimeUnit,Long> computeDiff(Date date1, Date date2) {
    long diffInMillies = date2.getTime() - date1.getTime();
    List<TimeUnit> units = new ArrayList<TimeUnit>(EnumSet.allOf(TimeUnit.class));
    Collections.reverse(units);
    Map<TimeUnit,Long> result = new LinkedHashMap<TimeUnit,Long>();
    long milliesRest = diffInMillies;
    for ( TimeUnit unit : units ) {
        long diff = unit.convert(milliesRest,TimeUnit.MILLISECONDS);
        long diffInMilliesForUnit = unit.toMillis(diff);
        milliesRest = milliesRest - diffInMilliesForUnit;
        result.put(unit,diff);
    }
    return result;
}

আউটপুট হ'ল Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0}ইউনিট অর্ডার সহ কিছু ।

লক্ষ্য লোকেল অনুযায়ী এই ডেটা কীভাবে আন্তর্জাতিক করা যায় তা নির্ধারণ করা আপনার উপর নির্ভর করে।


1

Java.util.concurrent.TimeUnit ব্যবহার করুন এবং এই সাধারণ পদ্ধতিটি ব্যবহার করুন:

private static long timeDiff(Date date, Date date2, TimeUnit unit) {
    long milliDiff=date2.getTime()-date.getTime();
    long unitDiff = unit.convert(milliDiff, TimeUnit.MILLISECONDS);
    return unitDiff; 
}

উদাহরণ স্বরূপ:

SimpleDateFormat sdf = new SimpleDateFormat("yy/MM/dd HH:mm:ss");  
Date firstDate = sdf.parse("06/24/2017 04:30:00");
Date secondDate = sdf.parse("07/24/2017 05:00:15");
Date thirdDate = sdf.parse("06/24/2017 06:00:15");

System.out.println("days difference: "+timeDiff(firstDate,secondDate,TimeUnit.DAYS));
System.out.println("hours difference: "+timeDiff(firstDate,thirdDate,TimeUnit.HOURS));
System.out.println("minutes difference: "+timeDiff(firstDate,thirdDate,TimeUnit.MINUTES));
System.out.println("seconds difference: "+timeDiff(firstDate,thirdDate,TimeUnit.SECONDS));

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.