JAVA中将时间戳字符串格式化_关于datetime:将时间戳(以毫秒为单位)转换为Java中的字符串格式化时间...

我正在尝试将一个长值(从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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值