![](/img/trans.png)
[英]How can I compare Date class with System.currentTimeMillis() in java
[英]How to convert currentTimeMillis to a date in Java?
我在服务器中生成的某些日志文件中有毫秒,我也知道生成日志文件的语言环境,我的问题是将毫秒转换为指定格式的日期。 该日志的处理发生在位于不同时区的服务器上。 转换为“SimpleDateFormat”程序时会获取机器的日期,因为这种格式化的日期不代表服务器的正确时间。 有没有办法优雅地处理这个?
long yourmilliseconds = 1322018752992l;
//1322018752992-Nov 22, 2011 9:25:52 PM
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS",Locale.US);
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
calendar.setTimeInMillis(yourmilliseconds);
System.out.println("GregorianCalendar -"+sdf.format(calendar.getTime()));
DateTime jodaTime = new DateTime(yourmilliseconds,
DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss,SSS");
System.out.println("jodaTime "+parser1.print(jodaTime));
输出:
Gregorian Calendar -2011-11-23 08:55:52,992
jodaTime 2011-11-22 21:25:52,992
您可以使用java.util.Date
类,然后使用SimpleDateFormat
来格式化Date
。
Date date=new Date(millis);
我们可以使用java.time包(教程)- Java SE 8 中引入的 DateTime API。
var instance = java.time.Instant.ofEpochMilli(millis);
var localDateTime = java.time.LocalDateTime
.ofInstant(instance, java.time.ZoneId.of("Asia/Kolkata"));
var zonedDateTime = java.time.ZonedDateTime
.ofInstant(instance,java.time.ZoneId.of("Asia/Kolkata"));
// Format the date
var formatter = java.time.format.DateTimeFormatter.ofPattern("u-M-d hh:mm:ss a O");
var string = zonedDateTime.format(formatter);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);
int mYear = calendar.get(Calendar.YEAR);
int mMonth = calendar.get(Calendar.MONTH);
int mDay = calendar.get(Calendar.DAY_OF_MONTH);
Instant.ofEpochMilli( 1_322_018_752_992L ) // Parse count of milliseconds-since-start-of-1970-UTC into an `Instant`.
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Assign a time zone to the `Instant` to produce a `ZonedDateTime` object.
其他答案使用过时或不正确的类。
避免使用旧的日期时间类,例如 java.util.Date/.Calendar。 事实证明,它们设计不当、令人困惑且麻烦。
java.time框架内置于 Java 8 及更高版本中。 大部分功能已向后移植到 Java 6 和 7,并进一步适用于 Android 。 由与制作Joda-Time相同的一些人制作。
一个Instant
是UTC时间线上的一个时刻,分辨率为纳秒。 它的纪元是 UTC 时间的 1970 年的第一个时刻。
假设您的输入数据是从 1970-01-01T00:00:00Z 开始的毫秒计数(问题中不清楚),那么我们可以轻松实例化Instant
。
Instant instant = Instant.ofEpochMilli( 1_322_018_752_992L );
Instant.toString(): 2011-11-23T03:25:52.992Z
该标准ISO 8601格式字符串中的Z
是Zulu
缩写,表示UTC 。
使用正确的时区名称应用时区,以获得ZonedDateTime
。
ZoneId zoneId = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( zoneId );
Asia/Kolkata
时区 ? 我猜您的代码受到印度时区的影响。 我们在这里看到,调整到Asia/Kolkata
时区会呈现与您报告的时间相同的时间,即08:55
,比我们的 UTC 值03:25
提前五个半小时。
2011-11-23T08:55:52.992+05:30[亚洲/加尔各答]
您可以应用 JVM 的当前默认时区。 请注意,默认值可能会在运行时随时更改。 JVM 中任何应用程序的任何线程中的任何代码都可以更改当前默认值。 如果重要,请询问用户他们想要/期望的时区。
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
java.time框架内置于 Java 8 及更高版本中。 这些类取代麻烦的老传统日期时间类,如java.util.Date
, Calendar
,和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle 教程。 并在 Stack Overflow 上搜索许多示例和解释。 规范是JSR 310 。
使用符合JDBC 4.2或更高版本的JDBC 驱动程序,您可以直接与您的数据库交换java.time对象。 不需要字符串或 java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra项目用额外的类扩展了 java.time。 该项目是未来可能添加到 java.time 的试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多。
最简单的方法是使用Joda DateTime 类并指定以毫秒为单位的时间戳和所需的 DateTimeZone。
我强烈建议避免使用内置的 Java Date 和 Calendar 类; 他们太可怕了。
我的解决方案
public class CalendarUtils {
public static String dateFormat = "dd-MM-yyyy hh:mm";
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
public static String ConvertMilliSecondsToFormattedDate(String milliSeconds){
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(Long.parseLong(milliSeconds));
return simpleDateFormat.format(calendar.getTime());
}
}
如果毫秒值是自格林威治标准时间 1970 年 1 月 1 日以来的毫秒数,这是 JVM 的标准,那么这与时区无关。 如果要使用特定时区对其进行格式化,只需将其转换为 GregorianCalendar 对象并设置时区即可。 之后,有多种方法可以对其进行格式化。
最简单的方法:
private String millisToDate(long millis){
return DateFormat.getDateInstance(DateFormat.SHORT).format(millis);
//You can use DateFormat.LONG instead of SHORT
}
我这样做:
static String formatDate(long dateInMillis) {
Date date = new Date(dateInMillis);
return DateFormat.getDateInstance().format(date);
}
您还可以使用带有以下参数的getDateInstance(int style)
:
DateFormat.SHORT
DateFormat.MEDIUM
DateFormat.LONG
DateFormat.FULL
DateFormat.DEFAULT
SimpleDateFormat 类有一个名为 SetTimeZone(TimeZone) 的方法,它是从 DateFormat 类继承的。 http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html
你可以试试 java.time api;
Instant date = Instant.ofEpochMilli(1549362600000l);
LocalDateTime utc = LocalDateTime.ofInstant(date, ZoneOffset.UTC);
以下是我从毫秒到日期格式获取日期的解决方案。 您必须使用Joda 库来运行此代码。
import java.util.GregorianCalendar;
import java.util.TimeZone;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class time {
public static void main(String args[]){
String str = "1431601084000";
long geTime= Long.parseLong(str);
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
calendar.setTimeInMillis(geTime);
DateTime jodaTime = new DateTime(geTime,
DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd");
System.out.println("Get Time : "+parser1.print(jodaTime));
}
}
public static LocalDateTime timestampToLocalDateTime(Long timestamp) {
return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), TimeZone.getDefault().toZoneId());
}
public static String getFormatTimeWithTZ(Date currentTime) {
SimpleDateFormat timeZoneDate = new SimpleDateFormat("EEE, dd-MM-yyyy hh:mm a", Locale.getDefault());
return timeZoneDate.format(currentTime);
}
输出是
Mon,01-03-2021 07:37 PM
和
public static String getFormatTimeWithTZ(Date currentTime) {
SimpleDateFormat timeZoneDate = new SimpleDateFormat("EEE, dd-MM-yyyy HH:mm ", Locale.getDefault());
return timeZoneDate.format(currentTime);
}
输出是
Mon,01-03-2021 19:37
如果您不想要 Days Then Remove EEE,
如果您不想要日期,则删除 dd-MM-yyyy
如果您想要以小时、分钟、秒、毫秒为单位的时间,请使用 HH:mm:ss.SSS
并在您想要的地方调用此方法
getFormatTimeWithTZ(Mydate)
在哪里
Date Mydate = new Date(System.currentTimeMillis());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.