초 값을 시간 분 초로 변환 하시겠습니까?


109

나는 초 값 (BigDecimal 변수)을 "1 시간 22 분 33 초"와 같은 editText의 문자열로 변환하려고했습니다.

나는 이것을 시도했다 :

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으로 설정합니다. 그러나 그것은 작동하지 않았습니다. 매번 앱을 강제 종료합니다. 나는 여기에 완전히 깊이 빠져 있습니다. 어떤 도움이라도 대단히 감사합니다. 즐거운 코딩 되세요!



BigInteger 대신 BigDecimal을 사용하는 이유는 무엇입니까?
Ted Hopp

나중에 dev에서 1 초의 몇 분의 1 초를 구현해야 할 것입니다. 지금은 계산이 처음부터 작동하도록 노력하고 있습니다.
rabbitt

1
Richard의 두 번째 의견입니다. TimeUnit 열거 형을 사용하여 많은 작업을 수행 할 수 있습니다. 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/...
알렉스 Kucherenko

해당 솔루션을 제외하고 @AlexKucherenko (밀리 초)와 함께 작동
미하일

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에서 1 초의 몇 분의 1 초를 구현해야 할 것입니다. 지금은 계산이 처음부터 작동하도록 노력하고 있습니다.
rabbitt

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

이것은 단순히 인상적입니다. 모듈러스가 어떻게 이런 식으로 작동 할 수 있는지 궁금합니다.
PSo

그렇지 않으면 경고를 표시합니다. 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
매개 변수가 초 단위로 예상된다는 것을 잊지 마십시오. 따라서 millis를 초로 변환해야합니다
kiranking

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 (긴 초)를 사용할 때 계산은 자정을 기준으로 합니다. 예를 들어 , 초가 86400 (24 시간)이면 00:00을 출력합니다.
karthi

이름이 'ConvertSecondToHHMMSSString'을 제안하는 것과 정확히 일치합니다. 다른 (지루한) 솔루션도 포장됩니다.
Epicurist

@Epicurist 이것은 내가 찾던 해결책이었습니다! 다른 모든 것보다 훨씬 더 우아하고! :)
Paulo Oliveira

20

Java의 내장 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;

}

코드의 기능과 문제 해결 방법을 설명하여 답변을 더욱 개선 할 수 있습니다. ;-)
2Dee

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 초


짧은 대답, 최고
카베 Garshasp

5

당신이 단위를 원하는 경우 h, minsec기간에 대한이를 사용할 수 있습니다 :

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 유형 변수를 사용하는 이유는 무엇입니까?
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

나는 이것을 파이썬에서 사용하여 초를 나타내는 부동 소수점을 시간, 분, 초 및 마이크로 초로 변환합니다. 합리적으로 우아하고 strptime을 통해 datetime 유형으로 변환하여 변환하는 데 편리합니다. 필요한 경우 더 긴 간격 (주, 월 등)으로 쉽게 확장 할 수도 있습니다.

    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을 사용하면 다음과 같이 긴 초에서 문자열 형식으로 시간을 쉽게 얻을 수 있습니다.

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이 코드 에 0이 아닌 초가 있었다면 원래대로 작동하지 않았을 수 있지만 수정할 수 있습니다. 코드는 Java 9 이상에서 작동합니다. Java 8에서 Duration시간 분과 초로 의 변환은 좀 더 복잡합니다. 방법은 하단의 링크를 참조하십시오. 나는 단어의 정확한 단 복수 형태를 선택하기 위해 당신에게 떠날 것입니다 ( 시간 또는 시간 등) .

연결

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.