将1904年以来的纳秒转换为有效的java日期
我有一个数字,表示从世界时间1904年1月1日凌晨12:00开始的纳秒数。我希望实例化一个表示该日期的将1904年以来的纳秒转换为有效的java日期,java,date,Java,Date,我有一个数字,表示从世界时间1904年1月1日凌晨12:00开始的纳秒数。我希望实例化一个表示该日期的java.util.Date对象。我应该如何继续?首先java.util.Date 分配日期对象并对其进行初始化,使其表示分配日期对象的时间,以最接近的毫秒测量 因此,如果有变量毫秒 以某种方式计算您的日期与1970年1月1日(Unix纪元)之间的毫秒数diff 使用日期(长)构造函数 new Date(milliseconds - diff); 我认为这是微不足道的: final Greg
java.util.Date
对象。我应该如何继续?首先java.util.Date
分配日期对象并对其进行初始化,使其表示分配日期对象的时间,以最接近的毫秒测量
因此,如果有变量毫秒
diff
日期(长)
构造函数
new Date(milliseconds - diff);
final GregorianCalendar startDate = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
startDate.clear();
startDate.set(1904, Calendar.JANUARY, 1);
final long startMillis = startDate.getTimeInMillis();
new Date(nanos / 1000 / 1000 + startMillis)
首先需要将表示纳秒的数字转换为毫秒 然后,对于给定的日期字符串,获取自unix时间纪元以来的总毫秒数,然后将先前转换为毫秒的数字添加到其中 以下是工作代码:
String target = "1904/01/01 12:00 AM"; // Your given date string
long nanoseconds = ...; // nanoseconds since target time that you want to convert to java.util.Date
long millis = TimeUnit.MILLISECONDS.convert(nanoseconds, TimeUnit.NANOSECONDS);
DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd hh:mm aaa");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = formatter.parse(target);
long newTimeInmillis = date.getTime() + millis;
Date date2 = new Date(newTimeInmillis);
System.out.println(date2);
添加import java.util.concurrent.TimeUnit代码>日期日期=新日期(new Date().getTime()-(时间单位为纳秒/(1000*1000))
用这个有什么不对?我在1926年6月8日用“时间单位为纳秒”的值进行了测试,结果是有效的。日期格式与此无关,表示时间的基本毫秒值是必需的。步骤1基本上不是“这里,奇迹发生了”吗?只是想如果日期是固定的,我们可以用“神奇”的方式来做(例如OP),数字不会像任何东西一样变化吗?日期格式应该是UTC时区,而且不在默认时区。您还忘记了日历系统,它依赖于语言环境,我的答案更精确。@kan:number of millis就是number of millis。这既不取决于地区,也不取决于日历。@jbnithe。只需将默认区域设置更改为日语,然后观看血腥的焰火。此外,此解决方案更为冗长和肮脏,例如,您需要try catch block。我尝试过此方法,但它为纳秒字段的两个不同值返回相同的日期,我做错了什么?并且Timestamp.valueOf()使用当前时区,而且不是UTC。@BalusC老实说,我不认为有一种使用jdk日期/时间函数的方法不会被滥用。。。总是最好使用Jodatime。@JBNizet是的,关于时区你是对的。正确的解决方法是使用公历,它不是默认的tz、区域设置和特定的。@dispake不要担心。我的第一次答案修订是使用Timestamp类而不是calendar。此方法还为两个不同的nano值返回相同的日期,例如3457619519760815616L和3457619519767058432您的解决方案完全错误。您的解决方案不会以任何方式引用1904年1月1日的日期,但结果需要取决于此日期。否则,您的解决方案也将适用于其他时间系统,比如1850年5月5日以来的纳秒(只是任意虚构的日期)。此外,在“以纳秒为单位的时间”前面有一个负号,其效果是,以纳秒为单位的时间越晚,日期对象的时间越早。此外,您的结果取决于当前时间。这使得这个相当简短的公式总共有3个错误。