在Java中将毫秒字符串转换为日期
我有一个字符串x =“1086073200000”。 这基本上是毫秒,我需要转换为Date。
转换我正在使用
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); long tempo1=Long.parseLong(x); System.out.println(tempo1); // output is 86073200000 instead of the whole thing long milliSeconds=1346482800000L; Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(milliSeconds); System.out.println(formatter.format(calendar.getTime()));
问题是当我将字符串x转换为long时,由于long的大小限制,一些数字会消失。
如何保留整个String。
谢谢。
double tempo=Double.parseDouble(z);
为什么要解析你的String
应该是一个Long
作为Double
?
尝试使用Long.parseLong
:
String x = "1086073200000" DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); long milliSeconds= Long.parseLong(x); System.out.println(milliSeconds); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(milliSeconds); System.out.println(formatter.format(calendar.getTime()));
我尝试了这段代码,它对我有用
public static void main(String[] args) { String x = "1086073200000"; long foo = Long.parseLong(x); System.out.println(x + "\n" + foo); Date date = new Date(foo); DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); System.out.println(formatter.format(date)); }
我使用了以下内容,它对我有用
Date date=new Date(milliSeconds);
日期日期=新日期(毫秒);
TL;博士
Instant.ofEpochMilli ( 1_346_482_800_000L );
2012-09-01T07:00:00Z
细节
Tim Bender接受的答案和enTropy的其他答案都是正确的。 您将输入字符串解析为double
而不是long
。
java.time
此外,问题和答案使用旧的过时日期时间类。 这些现在被java.time包取代。 请参阅Oracle教程 。 许多java.timefunction已经在ThreeTen-Backport中反向移植到Java 6和7,并在ThreeTenABP中进一步适应Android。
从时代算起
java.time类从与旧类相同的时期开始计算,1970年的第一个时刻是UTC 。 所以我们可以以相同的方式开始,将输入解析为long
。
String input = "1086073200000"; long millis = Long.parseLong ( input );
世界标准时间
使用该long
数字来获取Instant
对象。 此类表示UTC时间线上的一个时刻,在概念上类似于旧的java.util.Date
。 但是新类的分辨率高达纳秒,而旧的分辨率则限制为毫秒 。 幸运的是, Instant
类有一个方便的工厂方法,从ofEpochMilli
开始计算毫秒以来的ofEpochMilli
。
Instant instant = Instant.ofEpochMilli ( millis );
时区
现在指定一个时区( ZoneId
)来获取ZonedDateTime
对象。 这在概念上类似于java.util.Calendar
,因为它表示具有特定指定时区的时间轴上的时刻。
始终指定所需/预期的时区。 虽然是可选的,但不要像在问题中使用Calendar
时那样省略时区。 如果省略,则以静默方式应用JVM的当前默认时区。 此默认值可能因机器而异,有时也会因运行时(!)而异。 最好指定而不是假设。
ZoneId zoneId = ZoneId.of ( "America/Montreal" ); ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
转储到控制台。 请注意,在夏令时 , 夏令时(DST) ,该区域的时间为UTC时间为07
,而魁北克时间为03
,因为该区域的偏移量为-04:00
,比UTC晚4个小时。
System.out.println ( "input: " + input + " | millis: " + millis + " | instant: " + instant + " | zdt: " + zdt );
输入:1086073200000 | millis:1086073200000 | 时间:2004-06-01T07:00:00Z | zdt:2004-06-01T03:00-04:00 [美国/蒙特利尔]
字符串不是日期时间
如何保留整个String。
不要将描述日期时间值的文本字符串与日期时间本身混淆。 日期时间对象可以生成一个String来表示其值,但该String是独立的,与日期时间对象不同。
要从java.time对象(如ZonedDateTime
生成String,请执行以下任一操作:
- 调用
toString
以获取标准ISO 8601格式的String。
(如上面的示例代码所示) - 使用
DateTimeFormatter
:
(a)定义您自己的自定义格式,或
(b)自动本地化用户的人类语言和文化规范。
搜索Stack Overflow以获取有关从DateTimeFormatter
生成格式化字符串的许多其他问题和解答。
关于java.time
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
- Java SE 8 , Java SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和Java SE 7
- 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
- Android的
- ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
- 请参见如何使用ThreeTenABP ….
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。
我有以下内容
Date date = new Date(); date.setTime(Long.parseLong(milliseconds));
毫秒是一个字符串。
我希望它有所帮助。