我正在尝试将一个长值(从1970年1月1日起经过的毫秒数,即epoch)转换为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)
号
我该怎么办?
试试这个:
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。
请参阅使用输入1200 ms的可运行示例。
评论:HH将打印《时光在那个日期(0~23),不是总金额elapsed从70小时。只是说。
别忘了。老simpledateformat不能被用来实现多线程。
两个SimpleDateFormat使用的进口,进口follows:import java.text.*;AA
介绍,《老troublesome日期时间类如java.util.Date,java.util.Calendar,现在java.text.SimpleDateFormat鸭是传统的,supplanted java.time内置8到Java类和以后。在Oracle教程的城市。见:stackoverflow.com / / / 642706 4142428
《大学whats型logevent吗?你能把你的问题吗?
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);
在喜欢你更好的解决方案比accepted答案AS是一位有趣的和不明确的问题与镍的区域设置。虽然你最终的方小姐:millis = 1000 millis %,这将把milliseconds rightly尽头的formatted字符串。
multiplications鸭科是联想。(millis /(1000×60)是一样的AA(millis / 1000×60)
wesleydekeirsmaeker",在一般情况下,readability conciseness比冰更重要。
为什么remainder与24小时?
分冰槽的联想:50000 /(1000×60)=0.8333333333随50000 / 1000×60=3000。
millis %的millis = 1000冰缺失:如果你需要7天,这是你的大日子:=(millis /(1000×60×60×24));
怎么跨越秒?
"你是错误的wesleydekeirsmaeker;在爪哇(millis / 1000×60)是一样的(AA(millis / 1000)×60),而不是(millis /(1000×60)
你是正确的。
如果是biggest小时你会使用分区,你不会用"天"——在这个案例remove"24"%","长时光线=(millis /(1000×60×60))的24 %;
"你应该知道alphaaa hopefully评论,因为这是唯一的选择readability冰,当它不conciseness牺牲。我的仇恨,认为你应该已经被出版inaccurate代码的源代码的readability大学的缘故,这一切的时辰。
@Loungekatt我不明白为什么你把更易读的代码定义为"不准确"。我记得诺维格的"人工智能:一种现代方法"中的这段话,他解释说,在布尔逻辑中,不+和/或不+或是足够的…但是我们使用not+和+或"因为可读性通常比简洁性更重要"(不要记住确切的单词)。
@alphaaa tl;dr i不将可读性更高的代码定义为不准确。我为容易出错的简单任务定义了详细的解释。
我喜欢这个答案!
对于秒,您可以简单地使用long second=(durationinmillis/1000),我们在末尾不需要%60,在分钟内也不需要%60
我将向您展示三种方法:(a)从长值中获取分钟字段;(b)使用所需的日期格式打印该字段。一个使用JavaUTL日历,另一个使用JoDA时间,最后使用JavaTime框架内置到Java 8和更高版本中。
java.time框架取代了旧的捆绑日期时间类,它受到jsr 310定义的joda time的启发,并由threeten额外项目扩展。
JavaTimeFrand是使用Java 8和以后的方法。否则,如android,使用joda time。Java.UTI.Deal/NoalCalm类是众所周知的麻烦,应该避免使用。java.util.date&;日历
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);
乔达时间
// 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
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 );
。
millisecondsSinceEpoch: 1289375173771 instant: 2010-11-10T07:46:13.771Z output: 07:46:13:771
号
性能有任何原因或任何其他原因,应该是在preffer日历吗?
在简单的用例,这样,号:是在通用的API设计的最好的冰淇淋。例如,Java是mutable约会都是datetimes键槽。冰是娱乐节目也很友好,你可以访问几乎所有的功能性"DateTime类具有两个convert没有回来的日期和日历等等。
它是在没有任何dependencies应该知道吗?
dependencies号,这是一个独立的图书馆
好的答案,但我也知道specifying时间区而不是rely implicitly在JVM的当前默认时区。所以这两部电话constructor DateTime将第二的说法,一DateTimeZone对象。这样的new DateTime( timestamp, DateTimeZone.forID("America/Montreal" ) ):
"basilbourque THX的编辑。好的工作
"cratylus《java.time supplant类都是时间和旧传统的约会时间bundled与Java类。这是时间的方式java.time类项目的城市,都是一样的,"斯蒂芬colbourne。
可以使用ApacheCommons(commons-lang3)及其durationFormatUtils类。
org.apache.commons
commons-lang3
3.1
。
例如:
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);
。
这似乎不正确。例如,TimeUnit.MILLISECONDS.toSeconds()是否将毫秒转换为以秒为单位的相同持续时间,或在减去小时和分钟后的剩余秒数?解决方案需要后者。
不正确….
此方法不正确,如果我想将2019年3月12日的日期转换为13h04 42s,则返回431220:25873204:1552392282:0
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);
号
做
logEvent.timeStamp / (1000*60*60)
会给你几个小时,而不是几分钟。尝试:
logEvent.timeStamp / (1000*60)
号
最终你会得到和
TimeUnit.MILLISECONDS.toMinutes(logEvent.timeStamp)
但timeunit.milliseconds.tominutes(logevent.timestamp)也给予我的垃圾。21489586冰槽分钟!
它的数分钟通过自1970年01月01。
好的,那么怎么得到我想要的格式吗?例如:50 40 10:450?在不知道如何使用的分钟数从20世纪70年代。
啊,对不起,我以为你想知道如何有意义的信息。城市seanizer看到后,说要覆盖它。
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);
号