Saniye değeri saat dakika saniyeye dönüştürülsün mü?


109

Bir saniye değerini (bir BigDecimal değişkeninde) "1 saat 22 dakika 33 saniye" gibi bir editText dizgesine veya benzeri bir şeye dönüştürmeye çalışıyorum.

Bunu denedim:

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

(Saniyedeki değer olan roundThreeCalc'a sahibim, bu yüzden onu burada dönüştürmeye çalışıyorum.)

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

Sonra editText'i sequnceCaptureTime String olarak ayarladım. Ama bu işe yaramadı. Her seferinde uygulamayı kapatmaya zorladı. Burada tamamen derinliğimden uzaktayım, herhangi bir yardım çok takdir edilmektedir. Mutlu kodlamalar!



BigInteger yerine BigDecimal kullanmanız için herhangi bir neden var mı?
Ted Hopp

Bir saniyenin kesirlerini daha sonra dev'de uygulamam gerekecek, şu anda sadece hesaplamanın ilk etapta çalışmasını sağlamaya çalışıyorum.
tavşan

1
Richard'ın yorumunu ikinci kez yapıyorum - TimeUnit numaralandırmasını sizin için birçok iş yapmak için kullanabilirsiniz. developer.android.com/reference/java/util/concurrent/…
Ben J

İçinde saniye bulunan bir BigDecimal'den HHMMSS'ye dönüştürmek için zaman birimini nasıl kullanabilirim?
tavşan

Yanıtlar:


65

Daha fazla şansın olmalı

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

Bu, her bölümden sonra ondalık değerleri bırakacaktır.

Düzenleme: Bu işe yaramadıysa, bunu deneyin. (Sadece yazdım ve test ettim)

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


@AlexKucherenko, bu çözümün milisaniye ile çalışması dışında
Mikhail

1
@Mikhail TimeUnit. #### bunu herhangi bir zaman birimi ile yapmanıza izin verir.
Amir Omidi

1
Kendinizi saat ve tarih değerleriyle matematik yaparken bulduğunuzda, kendinizi durdurmanız ve elinizdeki dilde doğru API'yi bulmanız gerekir. Sadece bir HH: MM: SS türü yanıta ihtiyacınız varsa, daha iyi durumda olacaksınız DateUtils.formatElapsedTime...
dovetalk

229

BigDecimal kullanmak gerekli midir? Gerekmiyorsa, saniyeler için bir int veya long kullanırdım ve bu işleri biraz basitleştirirdi:

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

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

Yine de, dizede iki basamaklı değer (veya her neyse) olduğundan emin olmak için her birini doldurmak isteyebilirsiniz.


Bir saniyenin kesirlerini daha sonra dev'de uygulamam gerekecek, şu anda sadece hesaplamanın ilk etapta çalışmasını sağlamaya çalışıyorum.
tavşan

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

Bu çok etkileyici. Modülüsün bu şekilde nasıl çalıştığını merak ediyorum.
PSo

Yerel Ayar'ı kullanın, aksi takdirde sizi uyarır. String.format(Locale.ENGLISH, "%02d:%02d:%02d", hours, minutes, seconds)
Pratik Butani

1
Kendinizi saat ve tarih değerleriyle matematik yaparken bulduğunuzda, kendinizi durdurmanız ve elinizdeki dilde doğru API'yi bulmanız gerekir. Sadece bir HH: MM: SS türü yanıta ihtiyacınız varsa, daha iyi durumda olacaksınız DateUtils.formatElapsedTime...
dovetalk

75

DateUtils.formatElapsedTime(long), geçen zamanı " MM:SS" veya " H:MM:SS" biçiminde biçimlendirir . Aradığınız dizeyi döndürür. Belgeleri burada bulabilirsiniz


3
Bu basit ve tam da ihtiyacım olan şey. Başkalarına bu yöntemi tavsiye ederim
Nabin

1
Saniyeler içinde parametre beklediğini unutmayın. Yani milis değerini saniyeye çevirmeniz gerekiyor
kiranking

28

İşte çalışma kodu:

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
Bu cevabı beğendim ama '% 10'u' / 10 'olarak değiştirmeniz gerekiyor
Hakem Zaied

Kendinizi saat ve tarih değerleriyle matematik yaparken bulduğunuzda, kendinizi durdurmanız ve elinizdeki dilde doğru API'yi bulmanız gerekir. Sadece bir HH: MM: SS türü yanıta ihtiyacınız varsa, daha iyi durumda olacaksınız DateUtils.formatElapsedTime...
dovetalk

28

Java 8'de gerçekten yararlı bir şey

import java.time.LocalTime;

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

Not: Hesaplama artı saniye (uzun saniye) kullanıldığında gece yarısına sarılır, örneğin: saniye 86400 (24 saat) ise 00:00 çıktı verir.
karthi

Adın 'ConvertSecondToHHMMSSString' önerdiği şeyi tam olarak yapar. Diğer (sıkıcı) çözümler de etrafta dolanıyor.
Epicurist

@Epicurist aradığım çözüm buydu! Diğerlerinden çok daha zarif ve! :)
Paulo Oliveira

20

Java'nın yerleşik TimeUnit kitaplığını tercih ediyorum

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;

}

Kodun ne yaptığını ve sorunu nasıl çözdüğünü açıklayarak cevabınızı daha da iyileştirebilirsiniz ;-)
2De

9

Bu benim basit çözümüm:

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

İşleri basit tutmayı seviyorum bu nedenle:

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

Sonuç: 01 Saat 23 Dakika 20 Saniye


en kısa cevap, Awesome
Kaveh Garshasp

5

Eğer birimleri istiyorsanız h, minve secbir süre için bu kullanabilirsiniz:

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

Bu çok sayıda koşullu operatör. Yöntem şu dizeleri döndürecektir:

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

Güzel çözüm (Y)
Akshay Raiyani

4

Bu Kod İyi Çalışıyor:

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

4

GregorianCalendar kullanarak bunu yapmanın güzel ve kolay bir yolu

Bunları projeye aktarın:

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

Ve sonra:

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
Bunu seviyorum!
eduyayo

2

Bunu kullanıyorum:

 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

Sorunu çözmek için benim işlevim:

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

Neden bu bebek yolu gerekli girdileri depolamak için Çift tip değişkenler kullanıyor?
Epicurist

2

Bunun oldukça eski olduğunu biliyorum ama java 8'de:

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

2

sadece dakikalar ve saniyeler için bunu kullanın

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

1

Bunu python'da saniyeleri temsil eden bir kayan noktayı saatlere, dakikalara, saniyelere ve mikrosaniyelere dönüştürmek için kullanıyorum. Oldukça zariftir ve dönüştürmek için strptime aracılığıyla bir datetime türüne dönüştürmek için kullanışlıdır. Ayrıca gerekirse daha uzun aralıklara (haftalar, aylar vb.) Kadar uzatılabilir.

    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

en iyi yolu ve daha az kodu denedim, ancak kodumu nasıl yazdığımı anlamak biraz zor olabilir, ancak matematikte iyiyseniz çok kolay

import java.util.Scanner;

ders saatleri {

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





}

}

daha fazlası doğru!


1

Java 8 ile, String formatında uzun saniyelerden kolayca zaman elde edebilirsiniz.

LocalTime.ofSecondOfDay(86399L)

Burada, verilen değerin maksimum dönüşmesine izin verilir (24 saate kadar) ve sonuç

23:59:59

Artıları: 1) Manuel olarak dönüştürmeye ve tek basamak için 0 eklemeye gerek yok

Eksileri: yalnızca 24 saate kadar çalışın


1

Java 8 ile, LocalTime formatında uzun saniyeler gibi kolayca zaman elde edebilirsiniz:

LocalTime.ofSecondOfDay(86399L)

Burada, verilen değerin maksimum dönüşmesine izin verilir (24 saate kadar) ve sonuç

23:59:59

Artıları: 1) Manuel olarak dönüştürmeye ve tek basamak için 0 eklemeye gerek yok

Eksileri: yalnızca 24 saate kadar çalışın


1

Java.time süresi

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

Bu kod parçacığının çıktısı:

1 saat 22 dakika 33 saniye

Eğer BigDecimalbu kodda saniyenin sıfırdan farklı bir kısmı olsaydı, olduğu gibi çalışmazdı, ancak onu değiştirebilirsiniz. Kod, Java 9 ve sonrasında çalışır. Java 8'de Durationsaat dakika ve saniyeye dönüşüm biraz daha zordur, nasıl yapılacağını öğrenmek için alttaki bağlantıya bakın. Kelimelerin doğru tekil veya çoğul halini ( saat veya saatler vb.) Seçmeniz için size bırakıyorum .

Bağlantılar

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.