แปลงค่าวินาทีเป็นชั่วโมงนาทีวินาที?


109

ฉันพยายามแปลงค่าวินาที (ในตัวแปร BigDecimal) เป็นสตริงใน editText เช่น "1 ชั่วโมง 22 นาที 33 วินาที" หรืออะไรสักอย่าง

ฉันได้ลองแล้ว:

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");

(ฉันมี roundThreeCalc ซึ่งเป็นค่าเป็นวินาทีดังนั้นฉันจึงลองแปลงที่นี่)

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

จากนั้นฉันตั้งค่า editText เป็น sequnceCaptureTime String แต่นั่นไม่ได้ผล มันบังคับปิดแอพทุกครั้ง ฉันไม่ได้อยู่ที่นี่โดยสิ้นเชิงความช่วยเหลือใด ๆ ที่ได้รับการชื่นชมอย่างมาก ขอให้สนุกกับการเขียนโค้ด!



เหตุผลใดที่คุณใช้ BigDecimal แทน BigInteger
Ted Hopp

ฉันจะต้องใช้เศษส่วนของวินาทีต่อมาใน dev ตอนนี้ฉันแค่พยายามให้การคำนวณทำงานตั้งแต่แรก
rabbitt

1
ฉันเป็นความคิดเห็นที่สองของ Richard - คุณสามารถใช้ TimeUnit enum เพื่อทำงานมากมายให้กับคุณ developer.android.com/reference/java/util/concurrent/…
Ben J

ฉันจะใช้ timeunit เพื่อแปลงจาก BigDecimal ด้วยวินาทีเป็น HHMMSS ได้อย่างไร?
rabbitt

คำตอบ:


65

คุณควรมีโชคมากขึ้นด้วย

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

การดำเนินการนี้จะลดค่าทศนิยมหลังการหารแต่ละครั้ง

แก้ไข: หากไม่ได้ผลให้ลองทำเช่นนี้ (ฉันเพิ่งเขียนและทดสอบ)

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;
}

6
วิธีแก้ปัญหานี้มีความสง่างามมากขึ้น: stackoverflow.com/questions/625433/…
Alex Kucherenko

@AlexKucherenko ยกเว้นว่าโซลูชันนั้นใช้ได้กับมิลลิวินาที
Mikhail

1
@Mikhail TimeUnit. #### จะช่วยให้คุณทำกับหน่วยเวลาใดก็ได้
Amir Omidi

1
เมื่อใดก็ตามที่คุณพบว่าตัวเองกำลังคำนวณค่าเวลาและวันที่คุณต้องหยุดตัวเองและค้นหา API ที่เหมาะสมในภาษาที่ต้องการ หากคุณต้องการคำตอบแบบ HH: MM: SS คุณจะดีกว่าด้วยDateUtils.formatElapsedTime...
dovetalk

229

จำเป็นต้องใช้ BigDecimal หรือไม่? ถ้าคุณไม่จำเป็นต้องใช้ฉันจะใช้ int หรือ long เป็นวินาทีและมันจะทำให้สิ่งต่างๆง่ายขึ้นเล็กน้อย:

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

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

คุณอาจต้องการเติมแต่ละส่วนเพื่อให้แน่ใจว่าเป็นค่าสองหลัก (หรืออะไรก็ได้) ในสตริง


ฉันจะต้องใช้เศษส่วนของวินาทีต่อมาใน dev ตอนนี้ฉันแค่พยายามให้การคำนวณทำงานตั้งแต่แรก
rabbitt

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

นี่เป็นสิ่งที่น่าประทับใจ ฉันสงสัยว่าโมดูลัสทำงานในลักษณะนี้ได้อย่างไร
PSo

ใช้ Locale มิฉะนั้นจะให้คำเตือน String.format(Locale.ENGLISH, "%02d:%02d:%02d", hours, minutes, seconds)
Pratik Butani

1
เมื่อใดก็ตามที่คุณพบว่าตัวเองกำลังคำนวณค่าเวลาและวันที่คุณต้องหยุดตัวเองและค้นหา API ที่เหมาะสมในภาษาที่ต้องการ หากคุณต้องการคำตอบแบบ HH: MM: SS คุณจะดีกว่าด้วยDateUtils.formatElapsedTime...
dovetalk

75

DateUtils.formatElapsedTime(long)จัดรูปแบบเวลาที่ผ่านไปในรูปแบบ " MM:SS" หรือ " H:MM:SS" จะส่งคืนสตริงที่คุณกำลังมองหา คุณสามารถดูเอกสารประกอบได้ที่นี่


3
อันนี้ง่ายและตรงกับสิ่งที่ฉันต้องการ ฉันแนะนำวิธีนี้ให้คนอื่น
Nabin

1
อย่าลืมว่ามันคาดหวังพารามิเตอร์เป็นวินาที ดังนั้นคุณต้องแปลง
มิลลิ

28

นี่คือรหัสการทำงาน:

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
ฉันชอบคำตอบนี้ แต่คุณต้องเปลี่ยน '% 10' เป็น '/ 10'
Hakem Zaied

เมื่อใดก็ตามที่คุณพบว่าตัวเองกำลังคำนวณค่าเวลาและวันที่คุณต้องหยุดตัวเองและค้นหา API ที่เหมาะสมในภาษาที่ต้องการ หากคุณต้องการคำตอบแบบ HH: MM: SS คุณจะดีกว่าด้วยDateUtils.formatElapsedTime...
dovetalk

28

สิ่งที่เป็นประโยชน์ใน Java 8

import java.time.LocalTime;

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

หมายเหตุ:การคำนวณจะใช้เวลาประมาณเที่ยงคืนเมื่อใช้ plusSeconds (long seconds) เช่นถ้าวินาทีเท่ากับ 86400 (24 ชม.) จะแสดงผล 00:00
karthi

มันทำสิ่งที่ชื่อแนะนำ 'ConvertSecondToHHMMSSString' วิธีแก้ปัญหาอื่น ๆ (น่าเบื่อ) ก็กำลังห่อหุ้มอยู่
Epicurist

@Epicurist นี่คือทางออกที่ฉันกำลังมองหา! สง่างามกว่าคนอื่น ๆ ทั้งหมด! :)
Paulo Oliveira


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;

}

คุณสามารถปรับปรุงคำตอบของคุณเพิ่มเติมได้โดยการอธิบายว่าโค้ดใช้ทำอะไรและแก้ปัญหาได้อย่างไร ;-)
2 ดี

9

นี่คือวิธีง่ายๆของฉัน:

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

ฉันชอบที่จะทำให้สิ่งต่างๆเรียบง่ายดังนั้น:

    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);

ผลลัพธ์จะเป็น: 01 ชั่วโมง 23 นาที 20 วินาที


คำตอบที่สั้นที่สุดยอดเยี่ยม
Kaveh Garshasp

5

หากคุณต้องการหน่วยh, minและsecในช่วงระยะเวลาที่คุณสามารถใช้นี้

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);

นั่นคือตัวดำเนินการตามเงื่อนไขจำนวนมาก วิธีนี้จะส่งคืนสตริงเหล่านั้น:

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

ทางออกที่ดี (Y)
Akshay Raiyani

4

รหัสนี้ใช้งานได้ดี:

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

4

วิธีที่ดีและง่ายในการทำโดยใช้ GregorianCalendar

นำเข้าสิ่งเหล่านี้ในโครงการ:

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

แล้ว:

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
ฉันรักคนนี้!
eduyayo

2

ฉันใช้สิ่งนี้:

 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

นี่คือหน้าที่ของฉันในการแก้ไขปัญหา:

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));
}

ทำไมทารกถึงใช้ตัวแปรประเภท Double type เพื่อจัดเก็บ ints ที่จำเป็น
Epicurist

2

ฉันรู้ว่ามันค่อนข้างเก่า แต่ใน java 8:

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

2

เพียงนาทีและวินาทีใช้สิ่งนี้

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

1

ฉันใช้สิ่งนี้ใน python เพื่อแปลง float แทนวินาทีเป็นชั่วโมงนาทีวินาทีและไมโครวินาที มีความสวยงามพอสมควรและมีประโยชน์สำหรับการแปลงเป็นประเภทวันที่และเวลาผ่าน strptime เพื่อแปลง นอกจากนี้ยังสามารถขยายเป็นช่วงเวลาที่ยาวขึ้นได้อย่างง่ายดาย (สัปดาห์เดือน ฯลฯ ) หากจำเป็น

    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

ฉันได้ลองวิธีที่ดีที่สุดและใช้รหัสน้อยลง แต่อาจเป็นเรื่องยากเล็กน้อยที่จะเข้าใจว่าฉันเขียนโค้ดของฉันอย่างไร แต่ถ้าคุณเก่งคณิตศาสตร์มันก็ง่ายมาก

import java.util.Scanner;

ชั่วโมงเรียน {

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");





}

}

ยิ่งไปกว่านั้นคือความแม่นยำ!


1

ด้วย Java 8 คุณสามารถบรรลุเวลาในรูปแบบ String จากวินาทีที่ยาวนานเช่น

LocalTime.ofSecondOfDay(86399L)

ที่นี่ค่าที่ระบุคือสูงสุดที่อนุญาตให้แปลง (ไม่เกิน 24 ชั่วโมง) และผลลัพธ์จะเป็น

23:59:59

ข้อดี: 1) ไม่จำเป็นต้องแปลงด้วยตนเองและต่อท้าย 0 สำหรับตัวเลขหลักเดียว

จุดด้อย: ทำงานได้นานถึง 24 ชั่วโมงเท่านั้น


1

ด้วย Java 8 คุณสามารถบรรลุเวลาในรูปแบบ LocalTime ได้อย่างง่ายดายจากวินาทีที่ยาวนานเช่น

LocalTime.ofSecondOfDay(86399L)

ที่นี่ค่าที่ระบุคือสูงสุดที่อนุญาตให้แปลง (ไม่เกิน 24 ชั่วโมง) และผลลัพธ์จะเป็น

23:59:59

ข้อดี: 1) ไม่จำเป็นต้องแปลงด้วยตนเองและต่อท้าย 0 สำหรับตัวเลขหลักเดียว

จุดด้อย: ทำงานได้นานถึง 24 ชั่วโมงเท่านั้น


1

ระยะเวลาจาก 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);
    }

ผลลัพธ์จากตัวอย่างข้อมูลนี้คือ:

1 ชั่วโมง 22 นาที 33 วินาที

หากมีเศษเสี้ยววินาทีที่ไม่ใช่ศูนย์ในBigDecimalรหัสนี้จะไม่ทำงานตามที่ระบุไว้ แต่คุณอาจสามารถแก้ไขได้ โค้ดทำงานใน Java 9 และใหม่กว่า ใน Java 8 การแปลงจากDurationเป็นชั่วโมงนาทีและวินาทีนั้นมีความซับซ้อนมากขึ้นดูลิงก์ที่ด้านล่างสำหรับวิธีการ ฉันจะไปให้คุณเลือกรูปเอกพจน์หรือพหูพจน์ที่ถูกต้องของคำ ( ชั่วโมงหรือชั่วโมงฯลฯ )

ลิงค์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.