Java 是否将秒值转换为小时-分钟-秒?

Java 是否将秒值转换为小时-分钟-秒?,java,android,string,android-edittext,bigdecimal,Java,Android,String,Android Edittext,Bigdecimal,我一直在尝试将秒的值(在一个BigDecimal变量中)转换为editText中的字符串,比如“1小时22分33秒”之类的 我试过这个: String sequenceCaptureTime = ""; BigDecimal roundThreeCalc = new BigDecimal("0"); BigDecimal hours = new BigDecimal("0"); BigDecimal myremainder = new BigDecimal("0"); BigDecimal mi

我一直在尝试将秒的值(在一个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,它是以秒为单位的值,所以我尝试在这里进行转换。)

然后我将editText设置为sequnceCaptureTime字符串。
但那没用。每次都会强制关闭应用程序。我在这里完全没有能力,非常感谢您的帮助。快乐编码

你应该有更多的运气

hours = roundThreeCalc.divide(var3600, BigDecimal.ROUND_FLOOR);
myremainder = roundThreeCalc.remainder(var3600);
minutes = myremainder.divide(var60, BigDecimal.ROUND_FLOOR);
seconds = myremainder.remainder(var60);
这将在每次除法后删除十进制值

编辑:如果不起作用,试试这个。(我刚刚编写并测试了它)


有必要使用大十进制吗?如果不需要,我会使用int或long表示秒,这样会简化一些事情:

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

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

不过,您可能需要对每个字符串进行填充,以确保它们是字符串中的两位数值(或任何值)。

下面是我解决此问题的函数:

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));
}
公共静态字符串getConvertedTime(双时间){
双h,m,s,密耳;
密耳=时间%1000;
s=时间/1000;
m=s/60;
h=m/60;
s=s%60;
m=m%60;
h=h%24;
返回((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)密耳>100?字符串值((int)密耳):(int)密耳>9?“0”+字符串值((int)密耳):“00”+字符串值((int)密耳));
}

以下是工作代码:

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);
}
我用这个:

 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;           
    }
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);
公共字符串SEG2HOR(长lnValue){//OK
字符串lcStr=“00:00:00”;
字符串lcSign=(lnValue>=0?”:“-”;
lnValue=lnValue*(lnValue>=0?1:-1);
如果(lnValue>0){
长lnHor=(lnValue/3600);
长lnHor1=(lnValue%3600);
长lnMin=(lnHor1/60);
长lnSec=(lnHor1%60);
lcStr=lcSign+(lnHor<10?“0”:“”)+String.valueOf(lnHor)+“:”+
(lnMin<10?“0”:“”)+String.valueOf(lnMin)+“:”+
(lnSec<10?“0”:“)+String.valueOf(lnSec);
}
返回lcStr;
}
一些在Java 8中非常有用的东西
DateUtils.formatElapsedTime(long)
,将经过的时间格式化为“
MM:SS
”或“
H:MM:SS
”格式。它返回您要查找的字符串。您可以找到文档

如果您想要在一段时间内使用单位
h
min
sec
,您可以使用:

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

这是我的简单解决方案:

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


我知道这很旧,但在java 8中:

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

我更喜欢java内置的时间单位

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

我在python中使用它将表示秒的浮点转换为小时、分钟、秒和微秒。它相当优雅,可以方便地通过strtime转换为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

我喜欢把事情简单化,因此:

    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秒

我尝试了最好的方法,代码更少,但可能有点难理解我是如何编写代码的,但如果你擅长数学,那就很容易了

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





}
}


更多的是准确的

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

此代码工作正常:

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

只需几分钟和几秒钟,就可以使用这个

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

使用Java 8,您可以轻松地从很长的秒数中获得字符串格式的时间,如

LocalTime.ofSecondOfDay(86399L)
这里,给定的值是允许转换的最大值(最多24小时),结果将是

23:59:59
优点:1)不需要手动转换,也不需要为单个数字附加0

缺点:从java.time开始,最多只能工作24小时 此代码段的输出为:

1小时22分33秒

如果在
BigDecimal
中有一个非零的秒分数,那么这个代码就不能正常工作,但是您可以修改它。该代码在Java9及更高版本中工作。在Java8中,从
Duration
到小时分钟和秒的转换有点冗长,请参见底部的链接了解如何转换。我将留给您选择单词的正确单数或复数形式(小时或小时等)

链接
  • 解释如何使用java.time
  • 显示Java 8中从
    持续时间
    到天、小时、分钟和秒的转换

使用BigDecimal而不是BigInteger的任何原因都可能重复?我将在以后的开发中实现一秒的分数,现在我只是想让计算在第一位起作用。我支持Richard的评论-您可以使用时间单位枚举为您做很多工作。如何使用timeunit将包含秒的BigDecimal转换为HHMMSS?我将在以后的开发中实现一秒的小数,现在我只是想让计算首先工作。
String.format(“%02d:%02d:%02d”,小时,分钟,秒)这简直令人印象深刻。我想知道模数是如何以这种方式工作的。请使用Locale,否则它会给你警告
String.format(Locale.ENGLISH,“%02d:%02d:%02d”,小时、分钟、秒)
每当您发现自己正在使用时间和日期值进行数学运算时,您需要停下来用手头的语言找到正确的API。如果您只需要一个HH:MM:SS类型的响应,那么最好使用
DateUtils.formatElapsedTime
…此解决方案更优雅:@AlexKucherenko,但该解决方案与milliseconds@Mikhail时间单位。#######将允许您使用任何时间单位来完成。无论何时您发现自己正在做
txtTimer.setText(String.format("%02d:%02d:%02d",(SecondsCounter/3600), ((SecondsCounter % 3600)/60), (SecondsCounter % 60)));
String.format("%02d:%02d", (seconds / 3600 * 60 + ((seconds % 3600) / 60)), (seconds % 60))
LocalTime.ofSecondOfDay(86399L)
23:59:59
    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);
    }