Milisaniye cinsinden zaman damgasını Java'da dize biçimli zamana dönüştürün


126

Uzun bir değeri ( 1/1/1970 yani Epoch'dan geçen milisaniye sayısı ) biçim zamanına dönüştürmeye çalışıyorum h:m:s:ms.

Zaman damgası olarak kullandığım uzun değeri timestamp, log4j'den bir günlük olayının alanından alıyorum .

Şimdiye kadar aşağıdakileri denedim ve başarısız oldu:

logEvent.timeStamp/ (1000*60*60)
TimeUnit.MILLISECONDS.toMinutes(logEvent.timeStamp)

ama yanlış değer alıyorum:

1289375173771 for logEvent.timeStamp
358159  for logEvent.timeStamp/ (1000*60*60) 
21489586 for TimeUnit.MILLISECONDS.toMinutes(logEvent.timeStamp)

Bunu nasıl yapacağım?

Yanıtlar:


188

Bunu dene:

Date date = new Date(logEvent.timeSTamp);
DateFormat formatter = new SimpleDateFormat("HH:mm:ss.SSS");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String dateFormatted = formatter.format(date);

Sınıfın kabul ettiği diğer biçim dizelerinin açıklaması için SimpleDateFormat'a bakın .

1200 ms giriş kullanan çalıştırılabilir örneğe bakın .


8
Yorum: HH, 1970'ten bu yana geçen toplam saat miktarını değil, o tarihteki saati (0-23) basacaktır. Sadece söylüyorum.
JohnyTex

4
Ve unutma. Eski SimpleDateFormat çok iş parçacıklı kullanılamaz.
keiki

içe aktarmak SimpleDateFormatiçin içe import java.text.*;
aktarmayı

1
Bilginize, gibi zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time sonra Java 8 ve yerleşik sınıflara. Oracle'ın Eğitimi bölümüne bakın . Bakınız: stackoverflow.com/a/4142428/642706
Basil Bourque

1
Logevent türü nedir Soruya yazabilir misiniz?
Raulp

127
long millis = durationInMillis % 1000;
long second = (durationInMillis / 1000) % 60;
long minute = (durationInMillis / (1000 * 60)) % 60;
long hour = (durationInMillis / (1000 * 60 * 60)) % 24;

String time = String.format("%02d:%02d:%02d.%d", hour, minute, second, millis);

13
Çözümünüzü, biraz daha açık olduğundan ve yerel ayarlarla ilgili sorun yaşamadığından, kabul edilen yanıttan daha çok beğeniyorum. Son bölümü kaçırmış olsanız da: milis = milis% 1000, bu da doğru şekilde biçimlendirilmiş dizenin sonuna milisaniyeleri koyacaktır.
Ondrej Burkert

7
@WesleyDeKeirsmaeker, genel olarak okunabilirlik kısa ve öz olmaktan daha önemlidir.
Alphaaa

2
neden 24 ile saatlerce kalsın?
baboo

2
Bölüm ilişkilendirilebilir değil: 50000 / (1000 * 60) = 0.8333333333 iken 50000/1000 * 60 = 3000.
farnett

3
'millis = millis% 1000' eksik: D \ n ve günlere ihtiyacınız varsa, buraya gidin: 'long days = (milis / (1000 * 60 * 60 * 24));'
Adreamus

38

Size (a) dakika alanını uzun bir değerden almanın ve (b) istediğiniz Tarih biçimini kullanarak yazdırmanın üç yolunu göstereceğim. Biri java.util.Calendar kullanır , diğeri Joda-Time kullanır ve sonuncusu Java 8 ve sonrasında yerleşik java.time çerçevesini kullanır.

Java.time çerçevesi, eski paketlenmiş tarih-saat sınıflarının yerini alır ve JSR 310 tarafından tanımlanan ve ThreeTen-Extra projesi tarafından genişletilen Joda-Time'dan esinlenmiştir.

Java.time çerçevesi, Java 8 ve sonraki sürümleri kullanırken gitmenin yoludur. Aksi takdirde, Android gibi, Joda-Time'ı kullanın. Java.util.Date/.Calendar sınıfları herkesin bildiği gibi zahmetlidir ve bundan kaçınılması gerekir.

java.util.Date & .Calendar

final long timestamp = new Date().getTime();

// with java.util.Date/Calendar api
final Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(timestamp);
// here's how to get the minutes
final int minutes = cal.get(Calendar.MINUTE);
// and here's how to get the String representation
final String timeString =
    new SimpleDateFormat("HH:mm:ss:SSS").format(cal.getTime());
System.out.println(minutes);
System.out.println(timeString);

Joda-Time

// with JodaTime 2.4
final DateTime dt = new DateTime(timestamp);
// here's how to get the minutes
final int minutes2 = dt.getMinuteOfHour();
// and here's how to get the String representation
final String timeString2 = dt.toString("HH:mm:ss:SSS");
System.out.println(minutes2);
System.out.println(timeString2);

Çıktı:

24
09: 24: 10: 254
24
09: 24: 10: 254

java.time

long millisecondsSinceEpoch = 1289375173771L;
Instant instant = Instant.ofEpochMilli ( millisecondsSinceEpoch );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , ZoneOffset.UTC );

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "HH:mm:ss:SSS" );
String output = formatter.format ( zdt );

System.out.println ( "millisecondsSinceEpoch: " + millisecondsSinceEpoch + " instant: " + instant + " output: " + output );

milisaniyeSinceEpoch: 1289375173771 anlık: 2010-11-10T07: 46: 13.771Z çıktı: 07: 46: 13: 771


1
Herhangi bir performans veya başka bir neden var mı, Joda'yı Takvim'e tercih etmeliyim?
Kratilus'unda

1
bunun gibi basit durumlarda hayır. Genel olarak: Joda'nın API'si daha iyi tasarlanmıştır. Örneğin, java Tarihleri ​​değişebilir Joda DateTimes değildir. Joda aynı zamanda daha programcı dostudur, DateTime sınıfından neredeyse tüm işlevlere Tarih ve Takvim arasında geçiş yapmak zorunda kalmadan erişebilirsiniz
Sean Patrick Floyd

bilmem gereken herhangi bir bağımlılığı var mı?
Kratilus'unda

2
İyi yanıt, ancak dolaylı olarak JVM'nin mevcut varsayılan saat dilimine bağlı kalmak yerine saat dilimini belirtmeyi de öneririm. Dolayısıyla, DateTime yapıcısına yapılan çağrının ikinci bir argümanı, bir DateTimeZonenesnesi olacaktır. new DateTime( timestamp, DateTimeZone.forID( "America/Montreal" ) )
Şunun

2
@Cratylus java.time sınıfları, hem Joda-Time hem de Java ile birlikte gelen eski tarih-saat sınıflarının yerini alır . Joda-Time, her ikisi de aynı kişi olan Stephen Colbourne tarafından yönetilen java.time sınıflarına ilham verdi.
Basil Bourque

22

Apache commons (commons-lang3) ve onun DurationFormatUtils sınıfını kullanmak mümkündür.

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.1</version>
</dependency>

Örneğin:

String formattedDuration = DurationFormatUtils.formatDurationHMS(12313152);
// formattedDuration value is "3:25:13.152"
String otherFormattedDuration = DurationFormatUtils.formatDuration(12313152, DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN);
// otherFormattedDuration value is "P0000Y0M0DT3H25M13.152S"

Umarım yardımcı olabilir ...


8
long second = TimeUnit.MILLISECONDS.toSeconds(millis);
long minute = TimeUnit.MILLISECONDS.toMinutes(millis);
long hour = TimeUnit.MILLISECONDS.toHours(millis);
millis -= TimeUnit.SECONDS.toMillis(second);
return String.format("%02d:%02d:%02d:%d", hour, minute, second, millis);

2
Bu doğru görünmüyor. Mu TimeUnit.MILLISECONDS.toSeconds(), örneğin, saniye veya kalan saniyeler içinde aynı süreye dönüştürme milisaniye saatleri ve dakikaları çıkarıldıktan sonra? Çözüm, ikincisini gerektirir.
Derek Mahar

Bu yöntem yanlıştır, bu döndüren 431220: 25873204: 1552392282: 0 Ben tarihini dönüştürmek istiyorsanız 12 mart 2019 de 13h04 42 ve
0ddlyoko

6
public static String timeDifference(long timeDifference1) {
long timeDifference = timeDifference1/1000;
int h = (int) (timeDifference / (3600));
int m = (int) ((timeDifference - (h * 3600)) / 60);
int s = (int) (timeDifference - (h * 3600) - m * 60);

return String.format("%02d:%02d:%02d", h,m,s);

4

logEvent.timeStamp / (1000*60*60)

size dakika değil saat verecek. Deneyin:

logEvent.timeStamp / (1000*60)

ve aynı cevabı alacaksın

TimeUnit.MILLISECONDS.toMinutes(logEvent.timeStamp)

Ama TimeUnit.MILLISECONDS.toMinutes (logEvent.timeStamp) da çöpümü veriyor. 21489586 dakika değil!
Kratilus'unda

1
01/01/1970 tarihinden itibaren geçen dakika sayısıdır.
Nico Huysamen

Tamam, peki istediğim formatı nasıl elde ederim? Yani 10: 50: 40: 450? 1970'den beri dakika sayısını nasıl kullanacağımı bilmiyorum.
Cratylus

Üzgünüm, bunu nasıl anlamlandıracağını bilmek istediğini düşündüm. Seanizer'ın yazdığı gönderiye bakın, onu kapatması gerekir.
Nico Huysamen

3

Bunu dene:

    String sMillis = "10997195233";
    double dMillis = 0;

    int days = 0;
    int hours = 0;
    int minutes = 0;
    int seconds = 0;
    int millis = 0;

    String sTime;

    try {
        dMillis = Double.parseDouble(sMillis);
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }


    seconds = (int)(dMillis / 1000) % 60;
    millis = (int)(dMillis % 1000);

    if (seconds > 0) {
        minutes = (int)(dMillis / 1000 / 60) % 60;
        if (minutes > 0) {
            hours = (int)(dMillis / 1000 / 60 / 60) % 24;
            if (hours > 0) {
                days = (int)(dMillis / 1000 / 60 / 60 / 24);
                if (days > 0) {
                    sTime = days + " days " + hours + " hours " + minutes + " min " + seconds + " sec " + millis + " millisec";
                } else {
                    sTime = hours + " hours " + minutes + " min " + seconds + " sec " + millis + " millisec";
                }
            } else {
                sTime = minutes + " min " + seconds + " sec " + millis + " millisec";
            }
        } else {
            sTime = seconds + " sec " + millis + " millisec";
        }
    } else {
        sTime = dMillis + " millisec";
    }

    System.out.println("time: " + sTime);

0
    long hours = TimeUnit.MILLISECONDS.toHours(timeInMilliseconds);
    long minutes = TimeUnit.MILLISECONDS.toMinutes(timeInMilliseconds - TimeUnit.HOURS.toMillis(hours));
    long seconds = TimeUnit.MILLISECONDS
            .toSeconds(timeInMilliseconds - TimeUnit.HOURS.toMillis(hours) - TimeUnit.MINUTES.toMillis(minutes));
    long milliseconds = timeInMilliseconds - TimeUnit.HOURS.toMillis(hours)
            - TimeUnit.MINUTES.toMillis(minutes) - TimeUnit.SECONDS.toMillis(seconds);
    return String.format("%02d:%02d:%02d:%d", hours, minutes, seconds, milliseconds);
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.