Chuyển đổi giá trị giây thành giờ phút giây?


109

Tôi đang cố gắng chuyển đổi giá trị giây (trong biến BigDecimal) thành một chuỗi trong editText như "1 giờ 22 phút 33 giây" hoặc tương tự.

Tôi đã thử điều này:

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

(Tôi có roundThreeCalc là giá trị tính bằng giây nên tôi cố gắng chuyển đổi nó ở đây.)

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

Sau đó, tôi đặt editText thành Chuỗi thời gian sequnceCapture. Nhưng điều đó đã không thành công. Nó buộc phải đóng ứng dụng mọi lúc. Tôi hoàn toàn không hiểu về chuyên sâu của mình ở đây, bất kỳ sự trợ giúp nào cũng được đánh giá rất cao. Chúc bạn viết mã vui vẻ!



Bất kỳ lý do gì khiến bạn đang sử dụng BigDecimal thay vì BigInteger?
Ted Hopp

Tôi sẽ phải triển khai các phân số của giây sau đó trong dev, ngay bây giờ tôi chỉ đang cố gắng làm cho phép tính hoạt động ngay từ đầu.
Rabbitt

1
Tôi thứ hai nhận xét của Richard - bạn có thể sử dụng enum TimeUnit để thực hiện rất nhiều công việc cho bạn. developer.android.com/reference/java/util/concurrent/…
Ben J

Tôi sẽ sử dụng timeunit như thế nào để chuyển đổi từ BigDecimal với giây trong đó sang HHMMSS?
Rabbitt

Câu trả lời:


65

Bạn sẽ gặp nhiều may mắn hơn với

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

Thao tác này sẽ giảm các giá trị thập phân sau mỗi lần chia.

Chỉnh sửa: Nếu cách đó không hiệu quả, hãy thử cách này. (Tôi chỉ viết và thử nghiệm nó)

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
Giải pháp này là duyên dáng hơn: stackoverflow.com/questions/625433/...
Alex Kucherenko

@AlexKucherenko trừ giải pháp mà làm việc với mili giây
Mikhail

1
@Mikhail TimeUnit. #### sẽ cho phép bạn làm điều đó với bất kỳ đơn vị thời gian nào.
Amir Omidi

1
Bất cứ khi nào bạn thấy mình đang làm toán với các giá trị thời gian và ngày tháng, bạn cần tự dừng lại và tìm API phù hợp bằng ngôn ngữ hiện tại. Nếu bạn chỉ cần phản hồi kiểu HH: MM: SS, bạn sẽ tốt hơn với DateUtils.formatElapsedTime...
dovetalk

229

Có cần thiết phải sử dụng BigDecimal? Nếu bạn không cần phải làm vậy, tôi sẽ sử dụng int hoặc long trong giây, và nó sẽ đơn giản hóa mọi thứ một chút:

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

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

Tuy nhiên, bạn có thể muốn thêm từng giá trị để đảm bảo rằng chúng có hai giá trị chữ số (hoặc bất kỳ giá trị nào) trong chuỗi.


Tôi sẽ phải triển khai các phân số của giây sau đó trong dev, ngay bây giờ tôi chỉ đang cố gắng làm cho phép tính hoạt động ngay từ đầu.
Rabbitt

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

Điều này chỉ đơn giản là ấn tượng. Tôi tự hỏi làm thế nào mô-đun có thể hoạt động theo cách này.
PSo

Sử dụng Ngôn ngữ nếu không nó sẽ đưa ra cảnh báo cho bạn. String.format(Locale.ENGLISH, "%02d:%02d:%02d", hours, minutes, seconds)
Pratik Butani

1
Bất cứ khi nào bạn thấy mình đang làm toán với các giá trị thời gian và ngày tháng, bạn cần tự dừng lại và tìm API phù hợp bằng ngôn ngữ hiện tại. Nếu bạn chỉ cần phản hồi kiểu HH: MM: SS, bạn sẽ tốt hơn với DateUtils.formatElapsedTime...
dovetalk

75

DateUtils.formatElapsedTime(long), định dạng thời gian đã trôi qua ở dạng " MM:SS" hoặc " H:MM:SS". Nó trả về Chuỗi bạn đang tìm kiếm. Bạn có thể tìm tài liệu tại đây


3
Cái này đơn giản và chính xác những gì tôi cần. Tôi đề nghị những người khác phương pháp này
Nabin

1
Đừng quên rằng nó mong đợi tham số trong vài giây. Vì vậy, bạn cần chuyển đổi mili thành giây
kiranking

28

Đây là mã làm việc:

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
Tôi giống như câu trả lời này nhưng bạn cần phải thay đổi '% 10' đến '/ 10'
Hakem Zaied

Bất cứ khi nào bạn thấy mình đang làm toán với các giá trị thời gian và ngày tháng, bạn cần tự dừng lại và tìm API phù hợp bằng ngôn ngữ hiện tại. Nếu bạn chỉ cần phản hồi kiểu HH: MM: SS, bạn sẽ tốt hơn với DateUtils.formatElapsedTime...
dovetalk

28

Một cái gì đó thực sự hữu ích trong Java 8

import java.time.LocalTime;

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

Lưu ý: Tính toán kết thúc vào khoảng nửa đêm khi sử dụng plusSeconds (giây dài), ví dụ: nếu giây là 86400 (24 giờ), nó sẽ xuất ra 00:00.
karthi

Nó thực hiện chính xác những gì tên gợi ý 'ConvertSecondToHHMMSSString'. Các giải pháp (tẻ nhạt) khác cũng đang bao trùm.
Epicurist

@Epicurist đây là giải pháp tôi đang tìm kiếm! Thanh lịch hơn nhiều và hơn tất cả những cái khác! :)
Paulo Oliveira

20

Tôi thích java được xây dựng trong thư viện 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;

}

Bạn có thể cải thiện hơn nữa câu trả lời của bạn bằng cách giải thích những gì các mã không và làm thế nào nó giải quyết vấn đề ;-)
2Dee

9

Đây là giải pháp đơn giản của tôi:

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

Do đó, tôi muốn giữ mọi thứ đơn giản:

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

Kết quả sẽ là: 01 Giờ 23 Phút 20 Giây


ngắn nhất trả lời, Awesome
Kaveh Garshasp

5

Nếu bạn muốn các đơn vị h, minsectrong thời gian bạn có thể sử dụng này:

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

Đó là rất nhiều toán tử điều kiện. Phương thức sẽ trả về các chuỗi đó:

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

Đẹp dung dịch (Y)
Akshay Raiyani

4

Mã này đang hoạt động tốt:

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

4

Một cách hay và dễ dàng để làm điều đó bằng GregorianCalendar

Nhập những thứ này vào dự án:

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

Và sau đó:

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
Tôi yêu cái này!
eduyayo

2

Tôi sử dụng cái này:

 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

Đây là chức năng của tôi để giải quyết vấn đề:

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

Tại sao lại sử dụng cách sơ khai này để sử dụng các biến được gõ kép để lưu trữ các int cần thiết?
Epicurist

2

Tôi biết điều này khá cũ nhưng trong java 8:

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

2

chỉ trong vài phút và vài giây, hãy sử dụng cái này

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

1

Tôi sử dụng điều này trong python để chuyển đổi một số nổi biểu thị giây thành giờ, phút, giây và micro giây. Nó hợp lý thanh lịch và tiện dụng để chuyển đổi sang kiểu datetime thông qua strptime để chuyển đổi. Nó cũng có thể dễ dàng được mở rộng thành các khoảng thời gian dài hơn (tuần, tháng, v.v.) nếu cần.

    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

tôi đã thử cách tốt nhất và ít mã hơn nhưng có thể hơi khó hiểu cách tôi viết mã của mình nhưng nếu bạn giỏi toán thì rất dễ

import java.util.Scanner;

giờ học {

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





}

}

hơn nữa nó là chính xác!


1

Với Java 8, bạn có thể dễ dàng đạt được thời gian ở định dạng Chuỗi từ những giây dài như,

LocalTime.ofSecondOfDay(86399L)

Ở đây, giá trị đã cho được phép chuyển đổi tối đa (tối đa 24 giờ) và kết quả sẽ là

23:59:59

Ưu điểm: 1) Không cần chuyển đổi thủ công và thêm 0 cho một chữ số

Nhược điểm: chỉ hoạt động trong tối đa 24 giờ


1

Với Java 8, bạn có thể dễ dàng đạt được thời gian ở định dạng LocalTime từ vài giây dài như,

LocalTime.ofSecondOfDay(86399L)

Ở đây, giá trị đã cho được phép chuyển đổi tối đa (tối đa 24 giờ) và kết quả sẽ là

23:59:59

Ưu điểm: 1) Không cần chuyển đổi thủ công và thêm 0 cho một chữ số

Nhược điểm: chỉ hoạt động trong tối đa 24 giờ


1

Thời lượng từ 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);
    }

Đầu ra từ đoạn mã này là:

1 giờ 22 phút 33 giây

Nếu có một phần giây khác 0 trong BigDecimalmã này, mã này sẽ không hoạt động như hiện tại, nhưng bạn có thể sửa đổi nó. Mã hoạt động trong Java 9 trở lên. Trong Java 8, việc chuyển đổi từ Durationthành giờ phút và giây hơi dài dòng hơn một chút, hãy xem liên kết ở cuối để biết cách thực hiện. Tôi để bạn chọn hình thức số ít hoặc số nhiều chính xác của các từ ( giờ hoặc nhiều giờ , v.v.).

Liên kết

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.