Ubah nilai detik menjadi jam menit detik?


109

Saya telah mencoba untuk mengubah nilai detik (dalam variabel BigDecimal) menjadi string dalam editText seperti "1 jam 22 menit 33 detik" atau semacamnya.

Saya sudah mencoba ini:

String sequenceCaptureTime = "";
BigDecimal roundThreeCalc = new BigDecimal("0");
BigDecimal hours = new BigDecimal("0");
BigDecimal myremainder = new BigDecimal("0");
BigDecimal minutes = new BigDecimal("0");
BigDecimal seconds = new BigDecimal("0");
BigDecimal var3600 = new BigDecimal("3600");
BigDecimal var60 = new BigDecimal("60");

(Saya memiliki roundThreeCalc yang merupakan nilai dalam hitungan detik jadi saya mencoba mengonversinya di sini.)

hours = (roundThreeCalc.divide(var3600));
myremainder = (roundThreeCalc.remainder(var3600));
minutes = (myremainder.divide(var60));
seconds = (myremainder.remainder(var60));
sequenceCaptureTime =  hours.toString() + minutes.toString() + seconds.toString();

Lalu saya mengatur editText ke sequnceCaptureTime String. Tapi itu tidak berhasil. Itu memaksa menutup aplikasi setiap saat. Saya benar-benar keluar dari kedalaman saya di sini, bantuan apa pun sangat dihargai. Selamat membuat kode!



Ada alasan mengapa Anda menggunakan BigDecimal daripada BigInteger?
Ted Hopp

Saya harus menerapkan sepersekian detik nanti di dev, sekarang saya hanya mencoba membuat perhitungan berfungsi di tempat pertama.
rabbitt

1
Saya setuju dengan komentar Richard - Anda dapat menggunakan enum TimeUnit untuk melakukan banyak pekerjaan untuk Anda. developer.android.com/reference/java/util/concurrent/…
Ben J

Bagaimana saya akan menggunakan timeunit untuk mengonversi dari BigDecimal dengan detik di dalamnya menjadi HHMMSS?
rabbitt

Jawaban:


65

Anda harus lebih beruntung dengan

hours = roundThreeCalc.divide(var3600, BigDecimal.ROUND_FLOOR);
myremainder = roundThreeCalc.remainder(var3600);
minutes = myremainder.divide(var60, BigDecimal.ROUND_FLOOR);
seconds = myremainder.remainder(var60);

Ini akan menghilangkan nilai desimal setelah setiap pembagian.

Edit: Jika itu tidak berhasil, coba ini. (Saya baru saja menulis dan mengujinya)

public static int[] splitToComponentTimes(BigDecimal biggy)
{
    long longVal = biggy.longValue();
    int hours = (int) longVal / 3600;
    int remainder = (int) longVal - hours * 3600;
    int mins = remainder / 60;
    remainder = remainder - mins * 60;
    int secs = remainder;

    int[] ints = {hours , mins , secs};
    return ints;
}


@AlexKucherenko kecuali solusi itu bekerja dengan milidetik
Mikhail

1
@Mikhail TimeUnit. #### akan memungkinkan Anda melakukannya dengan unit waktu apa pun.
Amir Omidi

1
Kapan pun Anda menemukan diri Anda mengerjakan matematika dengan nilai waktu dan tanggal, Anda harus berhenti dan menemukan API yang tepat dalam bahasa yang ada. Jika Anda hanya membutuhkan respons tipe HH: MM: SS, Anda akan lebih baik dengan DateUtils.formatElapsedTime...
dovetalk

229

Apakah perlu menggunakan BigDecimal? Jika Anda tidak perlu, saya akan menggunakan int atau long selama beberapa detik, dan ini akan sedikit menyederhanakan:

hours = totalSecs / 3600;
minutes = (totalSecs % 3600) / 60;
seconds = totalSecs % 60;

timeString = String.format("%02d:%02d:%02d", hours, minutes, seconds);

Anda mungkin ingin mengisi masing-masing untuk memastikan nilai dua digit (atau apa pun) dalam string.


Saya harus menerapkan sepersekian detik nanti di dev, sekarang saya hanya mencoba membuat perhitungan berfungsi di tempat pertama.
rabbitt

13
String.format("%02d:%02d:%02d", hours, minutes, seconds);
Jeffrey Blattman

Ini sangat mengesankan. Saya bertanya-tanya bagaimana modulus bisa bekerja dengan cara ini.
PSo

Gunakan Lokal jika tidak itu akan memberi Anda peringatan. String.format(Locale.ENGLISH, "%02d:%02d:%02d", hours, minutes, seconds)
Pratik Butani

1
Kapan pun Anda menemukan diri Anda mengerjakan matematika dengan nilai waktu dan tanggal, Anda harus berhenti dan menemukan API yang tepat dalam bahasa yang ada. Jika Anda hanya membutuhkan respons tipe HH: MM: SS, Anda akan lebih baik dengan DateUtils.formatElapsedTime...
dovetalk

75

DateUtils.formatElapsedTime(long), memformat waktu yang telah berlalu dalam bentuk " MM:SS" atau " H:MM:SS". Ini mengembalikan String yang Anda cari. Anda dapat menemukan dokumentasinya di sini


3
Yang ini sederhana dan persis seperti yang saya butuhkan. Saya merekomendasikan metode ini kepada orang lain
Nabin

1
Jangan lupa bahwa itu mengharapkan parameter dalam hitungan detik. Jadi, Anda perlu mengubah milidetik menjadi detik
kiranking

28

Inilah kode yang berfungsi:

private String getDurationString(int seconds) {

    int hours = seconds / 3600;
    int minutes = (seconds % 3600) / 60;
    seconds = seconds % 60;

    return twoDigitString(hours) + " : " + twoDigitString(minutes) + " : " + twoDigitString(seconds);
}

private String twoDigitString(int number) {

    if (number == 0) {
        return "00";
    }

    if (number / 10 == 0) {
        return "0" + number;
    }

    return String.valueOf(number);
}

3
Saya suka jawaban ini tetapi Anda perlu mengubah '% 10' menjadi '/ 10'
Hakem Zaied

Kapan pun Anda menemukan diri Anda mengerjakan matematika dengan nilai waktu dan tanggal, Anda harus berhenti dan menemukan API yang tepat dalam bahasa yang ada. Jika Anda hanya membutuhkan respons tipe HH: MM: SS, Anda akan lebih baik dengan DateUtils.formatElapsedTime...
dovetalk

28

Sesuatu yang sangat membantu di Java 8

import java.time.LocalTime;

private String ConvertSecondToHHMMSSString(int nSecondTime) {
    return LocalTime.MIN.plusSeconds(nSecondTime).toString();
}

Catatan: Penghitungan berlangsung sekitar tengah malam saat menggunakan plusSeconds (detik panjang), misalnya: jika detik 86400 (24 jam) akan menghasilkan 00:00.
karthi

Itu persis seperti namanya 'ConvertSecondToHHMMSSString'. Solusi lain (membosankan) juga ada.
Epicurist

@Epicurist ini adalah solusi yang saya cari! Jauh lebih elegan dan dari yang lainnya! :)
Paulo Oliveira

20

Saya lebih suka java yang dibangun di perpustakaan TimeUnit

long seconds = TimeUnit.MINUTES.toSeconds(8);

12
private String ConvertSecondToHHMMString(int secondtTime)
{
  TimeZone tz = TimeZone.getTimeZone("UTC");
  SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
  df.setTimeZone(tz);
  String time = df.format(new Date(secondtTime*1000L));

  return time;

}

Anda dapat lebih meningkatkan jawaban Anda dengan menjelaskan apa yang dilakukan kode tersebut dan bagaimana cara menyelesaikan masalah ;-)
Lihat

9

Ini adalah solusi sederhana saya:

String secToTime(int sec) {
    int seconds = sec % 60;
    int minutes = sec / 60;
    if (minutes >= 60) {
        int hours = minutes / 60;
        minutes %= 60;
        if( hours >= 24) {
            int days = hours / 24;
            return String.format("%d days %02d:%02d:%02d", days,hours%24, minutes, seconds);
        }
        return String.format("%02d:%02d:%02d", hours, minutes, seconds);
    }
    return String.format("00:%02d:%02d", minutes, seconds);
}

Test Results:

Result: 00:00:36 - 36
Result: 01:00:07 - 3607
Result: 6313 days 12:39:05 - 545488745

6

Oleh karena itu, saya suka membuat semuanya sederhana:

    int tot_seconds = 5000;
    int hours = tot_seconds / 3600;
    int minutes = (tot_seconds % 3600) / 60;
    int seconds = tot_seconds % 60;

    String timeString = String.format("%02d Hour %02d Minutes %02d Seconds ", hours, minutes, seconds);

    System.out.println(timeString);

Hasilnya adalah: 01 Jam 23 Menit 20 Detik


Jawaban terpendek, Luar Biasa
Kaveh Garshasp

5

Jika Anda menginginkan unit h, mindan secuntuk suatu durasi Anda dapat menggunakan ini:

public static String convertSeconds(int seconds) {
    int h = seconds/ 3600;
    int m = (seconds % 3600) / 60;
    int s = seconds % 60;
    String sh = (h > 0 ? String.valueOf(h) + " " + "h" : "");
    String sm = (m < 10 && m > 0 && h > 0 ? "0" : "") + (m > 0 ? (h > 0 && s == 0 ? String.valueOf(m) : String.valueOf(m) + " " + "min") : "");
    String ss = (s == 0 && (h > 0 || m > 0) ? "" : (s < 10 && (h > 0 || m > 0) ? "0" : "") + String.valueOf(s) + " " + "sec");
    return sh + (h > 0 ? " " : "") + sm + (m > 0 ? " " : "") + ss;
}

int seconds = 3661;
String duration = convertSeconds(seconds);

Itu banyak sekali operator bersyarat. Metode ini akan mengembalikan string tersebut:

0    -> 0 sec
5    -> 5 sec
60   -> 1 min
65   -> 1 min 05 sec
3600 -> 1 h
3601 -> 1 h 01 sec
3660 -> 1 h 01
3661 -> 1 h 01 min 01 sec
108000 -> 30 h

Solusi bagus (Y)
Akshay Raiyani

4

Kode Ini Berfungsi dengan Baik:

txtTimer.setText(String.format("%02d:%02d:%02d",(SecondsCounter/3600), ((SecondsCounter % 3600)/60), (SecondsCounter % 60)));

4

Cara yang bagus dan mudah untuk melakukannya menggunakan GregorianCalendar

Impor ini ke dalam proyek:

import java.util.GregorianCalendar;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Scanner;

Lalu:

Scanner s = new Scanner(System.in);

System.out.println("Seconds: ");
int secs = s.nextInt();

GregorianCalendar cal = new GregorianCalendar(0,0,0,0,0,secs);
Date dNow = cal.getTime();
SimpleDateFormat ft = new SimpleDateFormat("HH 'hours' mm 'minutes' ss 'seconds'");
System.out.println("Your time: " + ft.format(dNow));

1
Saya suka yang ini!
eduyayo

2

Saya menggunakan ini:

 public String SEG2HOR( long lnValue) {     //OK
        String lcStr = "00:00:00";
        String lcSign = (lnValue>=0 ? " " : "-");
        lnValue = lnValue * (lnValue>=0 ? 1 : -1); 

        if (lnValue>0) {                
            long lnHor  = (lnValue/3600);
            long lnHor1 = (lnValue % 3600);
            long lnMin  = (lnHor1/60);
            long lnSec  = (lnHor1 % 60);            

                        lcStr = lcSign + ( lnHor < 10 ? "0": "") + String.valueOf(lnHor) +":"+
                              ( lnMin < 10 ? "0": "") + String.valueOf(lnMin) +":"+
                              ( lnSec < 10 ? "0": "") + String.valueOf(lnSec) ;
        }

        return lcStr;           
    }

2

Inilah fungsi saya untuk mengatasi masalah tersebut:

public static String getConvertedTime(double time){

    double h,m,s,mil;

    mil = time % 1000;
    s = time/1000;
    m = s/60;
    h = m/60;
    s = s % 60;
    m = m % 60;
    h = h % 24;

    return ((int)h < 10 ? "0"+String.valueOf((int)h) : String.valueOf((int)h))+":"+((int)m < 10 ? "0"+String.valueOf((int)m) : String.valueOf((int)m))
            +":"+((int)s < 10 ? "0"+String.valueOf((int)s) : String.valueOf((int)s))
            +":"+((int)mil > 100 ? String.valueOf((int)mil) : (int)mil > 9 ? "0"+String.valueOf((int)mil) : "00"+String.valueOf((int)mil));
}

Mengapa cara bayi ini menggunakan variabel diketik ganda untuk menyimpan int yang diperlukan?
Epicurist

2

Saya tahu ini cukup tua tetapi di java 8:

LocalTime.MIN.plusSeconds(120).format(DateTimeFormatter.ISO_LOCAL_TIME)

2

hanya beberapa menit dan detik gunakan ini

String.format("%02d:%02d", (seconds / 3600 * 60 + ((seconds % 3600) / 60)), (seconds % 60))

1

Saya menggunakan ini dengan python untuk mengubah float yang mewakili detik menjadi jam, menit, detik, dan mikrodetik. Ini cukup elegan dan berguna untuk mengkonversi ke tipe datetime melalui strptime untuk mengkonversi. Ini juga dapat dengan mudah diperpanjang ke interval yang lebih lama (minggu, bulan, dll.) Jika diperlukan.

    def sectohmsus(seconds):
        x = seconds
        hmsus = []
        for i in [3600, 60, 1]:  # seconds in a hour, minute, and second
            hmsus.append(int(x / i))
            x %= i
        hmsus.append(int(round(x * 1000000)))  # microseconds
        return hmsus  # hours, minutes, seconds, microsecond

1

Saya telah mencoba cara terbaik dan lebih sedikit kode tetapi mungkin agak sulit untuk memahami bagaimana saya menulis kode saya tetapi jika Anda pandai matematika, itu sangat mudah

import java.util.Scanner;

jam kelas {

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    double s;


    System.out.println("how many second you have ");
    s =input.nextInt();



     double h=s/3600;
     int h2=(int)h;

     double h_h2=h-h2;
     double m=h_h2*60;
     int m1=(int)m;

     double m_m1=m-m1;
     double m_m1s=m_m1*60;






     System.out.println(h2+" hours:"+m1+" Minutes:"+Math.round(m_m1s)+" seconds");





}

}

lebih dari itu akurat!


1

Dengan Java 8, Anda dapat dengan mudah mencapai waktu dalam format String dari detik yang panjang seperti,

LocalTime.ofSecondOfDay(86399L)

Di sini, nilai yang diberikan adalah maksimum yang diizinkan untuk dikonversi (hingga 24 jam) dan hasilnya adalah

23:59:59

Kelebihan: 1) Tidak perlu mengonversi secara manual dan menambahkan 0 untuk satu digit

Kekurangan: bekerja hanya hingga 24 jam


1

Dengan Java 8, Anda dapat dengan mudah mencapai waktu dalam format LocalTime dari detik yang panjang seperti,

LocalTime.ofSecondOfDay(86399L)

Di sini, nilai yang diberikan adalah maksimum yang diizinkan untuk dikonversi (hingga 24 jam) dan hasilnya adalah

23:59:59

Kelebihan: 1) Tidak perlu mengonversi secara manual dan menambahkan 0 untuk satu digit

Kekurangan: bekerja hanya hingga 24 jam


1

Durasi dari java.time

    BigDecimal secondsValue = BigDecimal.valueOf(4953);
    if (secondsValue.compareTo(BigDecimal.valueOf(Long.MAX_VALUE)) > 0) {
        System.out.println("Seconds value " + secondsValue + " is out of range");
    } else {
        Duration dur = Duration.ofSeconds(secondsValue.longValueExact());
        long hours = dur.toHours();
        int minutes = dur.toMinutesPart();
        int seconds = dur.toSecondsPart();

        System.out.format("%d hours %d minutes %d seconds%n", hours, minutes, seconds);
    }

Keluaran dari potongan ini adalah:

1 jam 22 menit 33 detik

Jika ada pecahan detik bukan nol dalam BigDecimalkode ini tidak akan berfungsi sebagaimana mestinya, tetapi Anda mungkin dapat memodifikasinya. Kode berfungsi di Java 9 dan yang lebih baru. Di Java 8, konversi dari Durationjam ke menit dan detik sedikit lebih bertele-tele, lihat tautan di bagian bawah untuk mengetahui caranya. Saya menyerahkan kepada Anda untuk memilih bentuk kata tunggal atau jamak yang benar ( jam atau jam , dll.).

Tautan

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.