Преобразовать значение секунд в часы минуты секунды?
Я пытался преобразовать значение секунд (в 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.
Но это не сработало. Это сила закрыла приложение каждый раз. Я совершенно не в своей тарелке здесь, любая помощь очень ценится. Счастливого кодирования!
17 ответов:
вы должны иметь больше удачи с
hours = roundThreeCalc.divide(var3600, BigDecimal.ROUND_FLOOR); myremainder = roundThreeCalc.remainder(var3600); minutes = myremainder.divide(var60, BigDecimal.ROUND_FLOOR); seconds = myremainder.remainder(var60);это отбросит десятичные значения после каждого деления.
Edit: если это не сработало, попробуйте это. (Я просто написал и протестировал его)
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; }
нужно ли использовать BigDecimal? Если вам не нужно, я бы использовал int или long в течение нескольких секунд, и это немного упростило бы ситуацию:
hours = totalSecs / 3600; minutes = (totalSecs % 3600) / 60; seconds = totalSecs % 60; timeString = String.format("%02d:%02d:%02d", hours, minutes, seconds);вы можете заполнить каждый, чтобы убедиться, что они двухзначные значения(или что-то еще) в строке, хотя.
DateUtils.formatElapsedTime(long), форматирует прошедшее время в виде"MM:SS" или "H:MM:SS" . Он возвращает строку, которую вы ищете. Вы можете найти документацию здесь
вот рабочий код:
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); }
что-то действительно полезное в Java 8
import java.time.LocalTime; private String ConvertSecondToHHMMSSString(int nSecondTime) { return LocalTime.MIN.plusSeconds(nSecondTime).toString(); }
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; }
Это мое простое решение:
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); }Result: 00:00:36 - 36 Result: 01:00:07 - 3607 Result: 6313 days 12:39:05 - 545488745
вот моя функция для решения проблемы:
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)); }
Мне нравится держать вещи простыми, поэтому:
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 секунд
этот код работает нормально :
txtTimer.setText(String.format("%02d:%02d:%02d",(SecondsCounter/3600), ((SecondsCounter % 3600)/60), (SecondsCounter % 60)));
Я использую этот:
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; }
Я знаю, что это довольно старый, но в java 8:
LocalTime.MIN.plusSeconds(120).format(DateTimeFormatter.ISO_LOCAL_TIME)
хороший и простой способ сделать это с помощью 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));
если вы хотите, чтобы блоки
h,minиsecв течение длительного времени вы можете использовать это: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
Я использую это в python для преобразования поплавка, представляющего секунды в часы, минуты, секунды и микросекунды. Это достаточно элегантно и удобно для преобразования в тип datetime через 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
Я пробовал лучший способ и меньше кода, но может быть, это немного трудно понять, как я написал свой код, но если вы хорошо в математике это так легко
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"); }}
более того, это точный !
Comments