在 Java 中将时间戳(以毫秒为单位)转换为字符串格式的时间

我试图转换一个长值(从1970年1月1日起经过的毫秒数,即“纪元”)的格式 h:m:s:ms的时间。

作为时间戳使用的长值来自 log4j 日志事件的字段 timestamp

到目前为止,我尝试了以下方法,但都失败了:

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

但我得到了不正确的值:

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

我该怎么做?

349250 次浏览

做什么

logEvent.timeStamp / (1000*60*60)

会给你几个小时,而不是几分钟。试试:

logEvent.timeStamp / (1000*60)

你最终得到的答案会和

TimeUnit.MILLISECONDS.toMinutes(logEvent.timeStamp)

试试这个:

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

有关该类接受的其他格式字符串的说明,请参见 SimpleDateFormat

使用1200ms 的输入参见 可以运用的例子

我将向您展示三种方法: (a)从长值中获取分钟字段,(b)使用所需的 Date 格式打印它。一个使用 Java.util. 日历,另一个使用 Joda 时间,最后一个使用构建在 Java8及更高版本中的 Java.time 框架。

Time 框架取代了原来捆绑的日期时间类,并受到 JSR 310定义的 Joda-Time 的启发,由 ThreeTen-Ultra 项目进行了扩展。

Time 框架是使用 Java8和更高版本时的方法。否则,如 Android,使用 Joda-Time。Java.util.日期/。日历类是出了名的麻烦,应该避免。

日期和日历

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 时间

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

产出:

24
你好
24
你好

爪哇时间

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

毫秒 SinceEpoch: 1289375173771 moment: 2010-11-10T07:46:13.771 Z output: 07:46:13.771 Z 输出: 07:46:13.771毫秒 SinceEpoch: 1289375173771即时: 2010-11-10T07:46:13.77

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

可以使用 apachecommons (commons-lang3)及其 DurationFormatUtils 类。

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

例如:

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"

希望能帮上忙。

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

试试这个:

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

我只想展示相关的部分时间。因此,始终显示秒,但只显示分钟/小时/天(如果有的话)。

此外,还可以选择显示毫秒。

我使用的是 GWT,所以不能使用 String.format。

所以,如果这也是你,这是密码。

public static String formatTimeFromMs(long timeInMs, boolean showMs) {
boolean negative = timeInMs < 0;


timeInMs = Math.abs(timeInMs);


StringBuffer result = new StringBuffer();
long seconds = (timeInMs / 1000) % 60;
long minutes = (timeInMs / (1000 * 60)) % 60;
long hours = (timeInMs / (1000 * 60 * 60)) % 24;
long days = (timeInMs / (1000 * 60 * 60 * 24));


if (days > 0) {
result.append(days + "d ");
}
    

if (hours > 0) {
if (hours < 10 && result.length() > 0) {
result.append("0");
}
result.append(hours + ":");
}
else if (result.length() > 0) {
result.append("00:");
}


if (minutes > 0) {
if (minutes < 10 && result.length() > 0) {
result.append("0");
}
result.append(minutes + ":");
}
else if (result.length() > 0) {
result.append("00:");
}


if (seconds > 0) {
if (seconds < 10 && result.length() > 0) {
result.append("0");
}
result.append(seconds);
}
else if (result.length() > 0) {
result.append("00");
}
else {
result.append("0");
}


if (showMs) {
long millis = timeInMs % 1000;
        

if (millis < 10) {
result.append(".00" + millis);
}
else if (millis < 100) {
result.append(".0" + millis);
}
else {
result.append("." + millis);
}
}


if (negative) {
result.insert(0, "-");
}


return result.toString();
}