【问题标题】:Convert seconds value to hours minutes seconds?将秒值转换为小时分钟秒?
【发布时间】:2011-09-01 09:55:10
【问题描述】:

我一直在尝试将秒值(在 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 字符串。 但这没有用。它每次都强制关闭应用程序。我在这里完全超出了我的深度,非常感谢任何帮助。快乐编码!

【问题讨论】:

标签: java android string android-edittext bigdecimal


【解决方案1】:

如果你想要单位 hminsec 持续一段时间,你可以使用这个:

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

【讨论】:

    【解决方案2】:

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

    这个 sn-p 的输出是:

    1 小时 22 分 33 秒

    如果BigDecimal 中有一个非零的秒小数部分,则此代码将无法正常工作,但您可以修改它。该代码适用于 Java 9 及更高版本。在 Java 8 中,从 Duration 到小时分钟和秒的转换有点冗长,请参阅底部的链接了解如何操作。我让您选择正确的单数或复数形式的单词(hourhours 等)。

    链接

    【讨论】:

      【解决方案3】:

      使用 Java 8,您可以轻松地实现字符串格式的时间,比如长秒,

      LocalTime.ofSecondOfDay(86399L)
      

      在这里,给定值是允许转换的最大值(最多 24 小时),结果将是

      23:59:59
      

      优点:1)无需手动转换并为单个数字附加 0

      缺点:最多只能工作 24 小时

      【讨论】:

        【解决方案4】:

        只用几分钟和几秒钟

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            此代码运行良好:

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

            【讨论】:

              【解决方案7】:

              我知道这已经很老了,但在 java 8 中:

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

              【讨论】:

                【解决方案8】:

                这是我的简单解决方案:

                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
                

                【讨论】:

                  【解决方案9】:

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

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

                  }

                  更多是准确的!

                  【讨论】:

                    【解决方案10】:

                    因此我喜欢保持简单:

                        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 秒

                    【讨论】:

                    • 最短答案,太棒了
                    【解决方案11】:

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

                    【讨论】:

                      【解决方案12】:

                      我更喜欢java内置的TimeUnit

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

                      【讨论】:

                        【解决方案13】:

                        DateUtils.formatElapsedTime(long),以 "MM:SS" 或 "H:MM:SS" 的形式格式化经过的时间。它返回您正在寻找的字符串。你可以找到文档here

                        【讨论】:

                        • 这个很简单,正是我需要的。我向其他人推荐这种方法
                        • 不要忘记它期望以秒为单位的参数。所以你需要将毫秒转换为秒
                        【解决方案14】:

                        是否需要使用 BigDecimal?如果您不需要,我会使用 int 或 long 几秒钟,这会简化一些事情:

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

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

                        【讨论】:

                        • 稍后我将不得不在 dev 中实现几分之一秒,现在我只是想首先让计算工作。
                        • String.format("%02d:%02d:%02d", hours, minutes, seconds);
                        • 这简直令人印象深刻。我想知道模数如何以这种方式工作。
                        • 使用区域设置,否则它会给你警告。 String.format(Locale.ENGLISH, "%02d:%02d:%02d", hours, minutes, seconds)
                        • 每当您发现自己在使用时间和日期值进行数学运算时,您都需要停下来,并在手头的语言中找到正确的 API。如果您只需要 HH:MM:SS 类型的响应,最好使用DateUtils.formatElapsedTime...
                        【解决方案15】:
                        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;
                        
                        }
                        

                        【讨论】:

                        • 您可以通过解释代码的作用以及它如何解决问题来进一步改进您的答案;-)
                        • 如果您的秒数超过 24 小时,所提供的代码将无法正常工作。
                        【解决方案16】:

                        Java 8 中真正有用的东西

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

                        【讨论】:

                        • 注意: 当使用 plusSeconds(长秒)时,计算会在午夜左右结束,例如: 如果秒为 86400(24 小时),则输出00:00。
                        • 它的功能正如其名称所暗示的“ConvertSecondToHHMMSSString”。其他(乏味的)解决方案也在不断完善。
                        • @Epicurist 这是我正在寻找的解决方案!比其他所有优雅得多! :)
                        【解决方案17】:

                        这是我解决问题的功能:

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

                        【讨论】:

                        • 为什么这种婴儿方式使用双类型变量来存储必要的整数?
                        【解决方案18】:

                        我用这个:

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

                        【讨论】:

                          【解决方案19】:

                          这是工作代码:

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

                          【讨论】:

                          • 我喜欢这个答案,但您需要将 '% 10' 更改为 '/ 10'
                          • 每当您发现自己在使用时间和日期值进行数学运算时,您都需要停下来,并在手头的语言中找到正确的 API。如果您只需要 HH:MM:SS 类型的响应,则最好使用 DateUtils.formatElapsedTime...
                          【解决方案20】:

                          你应该有更多的运气

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

                          【讨论】:

                          • 这个方案比较优雅:stackoverflow.com/questions/625433/…
                          • @AlexKucherenko 除了该解决方案以毫秒为单位
                          • @Mikhail TimeUnit.#### 将允许您使用任何时间单位。
                          • 每当您发现自己在使用时间和日期值进行数学运算时,您都需要停下来,并在手头的语言中找到正确的 API。如果您只需要 HH:MM:SS 类型的响应,最好使用 DateUtils.formatElapsedTime...
                          猜你喜欢
                          • 2021-10-29
                          • 1970-01-01
                          • 1970-01-01
                          • 2012-06-15
                          • 2015-06-02
                          • 1970-01-01
                          相关资源
                          最近更新 更多