Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将1904年以来的纳秒转换为有效的java日期_Java_Date - Fatal编程技术网

将1904年以来的纳秒转换为有效的java日期

将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

我有一个数字,表示从世界时间1904年1月1日凌晨12:00开始的纳秒数。我希望实例化一个表示该日期的
java.util.Date
对象。我应该如何继续?

首先
java.util.Date

分配日期对象并对其进行初始化,使其表示分配日期对象的时间,以最接近的毫秒测量

因此,如果有变量
毫秒

  • 以某种方式计算您的日期与1970年1月1日(Unix纪元)之间的毫秒数
    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个错误。