我有一个字符串x =“1086073200000”。这基本上是毫秒,我需要转换为日期。
转换我正在使用
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的大小限制,一些数字会消失。
如何保留整个字符串。
感谢。
答案 0 :(得分:31)
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()));
答案 1 :(得分:7)
我尝试了这段代码,它对我有用
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));
}
答案 2 :(得分:3)
Date date = new Date(milliseconds);
答案 3 :(得分:3)
Instant.ofEpochMilli ( 1_346_482_800_000L );
2012-09-01T07:00:00Z
accepted answer by Tim Bender和other answer by enTropy都是正确的。您将输入字符串解析为double
而不是long
。
此外,问题和答案正在使用旧的过时日期时间类。这些现在被java.time包取代。见Oracle Tutorial。许多java.time功能已经被反向移植到Java 6& ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。
java.time类与旧类相同的epoch计数,是UTC中1970年的第一个时刻。因此,我们可以以相同的方式开始,将输入解析为long
。
String input = "1086073200000";
long millis = Long.parseLong ( input );
使用该long
号码获取Instant
个对象。此类表示UTC时间线上的一个时刻,在概念上类似于旧java.util.Date
。但是新课程的分辨率最高为nanoseconds,而旧课程的分辨率仅为milliseconds。幸运的是,Instant
类有一个方便的工厂方法,从毫秒开始计算,因为 - 纪元,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 );
转储到控制台。请注意,在UTC中,07
的时间是03
,而魁北克省的时间是-04:00
,因为该区域的偏移量为System.out.println ( "input: " + input + " | millis: " + millis + " | instant: " + instant + " | zdt: " + zdt );
,比UTC还要落后4小时,{{3 }}
ZonedDateTime
输入:1086073200000 | millis:1086073200000 |时间:2004-06-01T07:00:00Z | zdt:2004-06-01T03:00-04:00 [美国/蒙特利尔]
如何保留整个字符串。
不要将描述日期时间值的文本字符串与日期时间本身混淆。日期时间对象可以生成一个String来表示其值,但该String与日期时间对象是独立且不同的。
要从java.time对象(例如DateTimeFormatter
)生成String,请执行以下操作:
toString
格式的字符串。搜索Stack Overflow以获取有关从{{1}}生成格式化字符串的许多其他问题和解答。
DateTimeFormatter
框架内置于Java 8及更高版本中。这些类取代了麻烦的旧java.time日期时间类,例如legacy,java.util.Date
和& Calendar
现在位于SimpleDateFormat
的Joda-Time项目建议迁移到maintenance mode类。
要了解详情,请参阅java.time。并搜索Stack Overflow以获取许多示例和解释。规范是Oracle Tutorial。
从哪里获取java.time类?
How to use ThreeTenABP…项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如ThreeTen-Extra,Interval
,YearWeek
和YearQuarter
。