GVKun编程网logo

java.lang.System.currentTimeMillis()替换方法(java替换replace)

29

本文将分享java.lang.System.currentTimeMillis的详细内容,并且还将对替换方法进行详尽解释,此外,我们还将为大家带来关于calendar.getTimeInMillis(

本文将分享java.lang.System.currentTimeMillis的详细内容,并且还将对替换方法进行详尽解释,此外,我们还将为大家带来关于calendar.getTimeInMillis() 和 System.currentTimeMillis() 的区别、java System.currentTimeMillis()毫秒值和具体日期值互相转换、Java 中时间处理 System.currentTimeMillis()、java 使用 new Date () 和 System.currentTimeMillis () 获取当前时间戳的相关知识,希望对你有所帮助。

本文目录一览:

java.lang.System.currentTimeMillis()替换方法(java替换replace)

java.lang.System.currentTimeMillis()替换方法(java替换replace)

除了重新编译之外,rt.jar还有什么方法可以用currentTimeMillis()我自己的一个替换调用?

1#正确的方法是使用Clock对象和抽象时间。

我知道,但是我们将运行由大量尚未实现Clock或自己实现的开发人员开发的代码。


2#使用JMockit之类的模拟工具模拟该类。

即使仅在禁用Hotspot的情况下有效,-Xint并且使用下面的代码也成功,但它不会“持久化”在外部库上。这意味着您必须在所有地方都进行模拟,因为代码不受我们的控制,因此这是不可行的。下的所有代码main()的确返回0毫秒(如示例所示),但是a
new DateTime()将返回实际的系统毫秒数。

    @MockClass(realClass = System.class)    public class SystemMock extends MockUp<System> {         // returns 1970-01-01           @Mock public static long currentTimeMillis() { return 0; }    }

3#System使用-Xbootclasspath/p(已编辑) 重新声明 启动

在可能的情况下,尽管您可以创建/更改方法,但有问题的方法声明为public static native longcurrentTimeMillis();。您必须先深入研究Sun的专有和 本机
代码,才能更改其声明,这将使之成为逆向工程,而且几乎不是一种稳定的方法。所有最近的SUN JVM崩溃,并出现以下错误:

    EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000, pid=4668, tid=5736

4#使用自定义的ClassLoader (评论中建议的新测试)

尽管使用-Djava.system.class.loaderJVM轻松替换系统CL的过程实际上是通过默认的classLoader加载了自定义classLoader,并且系统甚至没有通过自定义CL。

    public class SimpleClassLoader extends ClassLoader {        public SimpleClassLoader(ClassLoader classLoader) {            super(classLoader);        }        @Override         public Class<?> loadClass(String name) throws ClassNotFoundException {            return super.loadClass(name);        }       }

我们可以看到,java.lang.System从装载rt.jar使用java -verbose:class

Line 15: [Loaded java.lang.System from C:\jdk1.7.0_25\jre\lib\rt.jar]

我没有其他选择了。
我缺少一些方法吗?

答案1

小编典典

您可以使用AspectJ编译器/编织器来编译/编织有问题的用户代码,将对java.lang.System.currentTimeMillis()的调用替换为您自己的代码。以下方面将做到这一点:

public aspect CurrentTimeInMillisMethodCallChanger {    long around():        call(public static native long java.lang.System.currentTimeMillis())        && within(user.code.base.pckg.*) {         return 0; //provide your own implementation returning a long    }}

calendar.getTimeInMillis() 和 System.currentTimeMillis() 的区别

calendar.getTimeInMillis() 和 System.currentTimeMillis() 的区别

   @Test
    public void test01(){
        Calendar calendar=Calendar.getInstance();
       // calendar.set(2019,06,04,16,42,50);
        long date1=calendar.getTimeInMillis();
        long date2=System.currentTimeMillis();
        Date turnDate1=new Date(date1);
        Date turnDate2=new Date(date2);
        SimpleDateFormat fm=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(fm.format(turnDate1));
        System.out.println(fm.format(turnDate2));

    }

 

两个时间是一样的。

 2.性能比较

/**
     * 各循环十万次获取时间戳
     */
    @Test
    public void test03(){
        Calendar calendar=Calendar.getInstance();
        long startTime=System.currentTimeMillis();
        for(long i=0;i<100000;i++){
            long date1=calendar.getTimeInMillis();
        }
        System.out.println("calender花费的时间:"+(System.currentTimeMillis()-startTime));

        long startTime2=System.currentTimeMillis();
        for(long i=0;i<100000;i++){
            long date2=System.currentTimeMillis();
        }
        System.out.println("calender花费的时间:"+(System.currentTimeMillis()-startTime2));
    }

本机测试发现值不稳定。查看源码System.currentTimeMillis 使用的nativae 方法,猜测是这种取时间更快。欢迎指正

 

java System.currentTimeMillis()毫秒值和具体日期值互相转换

java System.currentTimeMillis()毫秒值和具体日期值互相转换

System.currentTimeMillis()与日期 间是可以相互转换的,通过

SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String dateStr = dateformat.format(System.currentTimeMillis());

可以获取如“ 2016-09-02 23:02:17 ”这样的一个字符串,但是反过来呢?如果给我们一个“ 2016-09-02 23:02:17 ”字符串,我们能否得到当前日期对应的毫秒值呢? 答案是肯定的。

SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

try {

       long time = dateformat.parse("2016-09-02 23:02:17").getTime();

       System.out.println(time);

}

catch (ParseException e) {

                     e.printStackTrace();

}

  •  

输出:1472828537000; 
由此可见,毫秒值与日期之间是可以互转的。

总结:测试时候可能会出现当前获取的毫秒值转换为日期后,再转为毫秒值时候 与前者不一致,这个是因为获取的是毫秒值,而转换为日期后是以秒为单位了,所以转换后才会出现这种情况。 解决方法:在时间格式化的时候写成

SimpleDateFormat dateformat = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss.SSS”);

Java 中时间处理 System.currentTimeMillis()

Java 中时间处理 System.currentTimeMillis()

import org.testng.annotations.Test;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class TestDate {    @Test    public void test01() throws ParseException {        Date dt= new Date();        long s=System.currentTimeMillis();        long long1= 1533954986837L;        SimpleDateFormat dtf = new SimpleDateFormat("yyyy-MM-dd");        SimpleDateFormat dtf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss@SSS");        String sdate =dtf1.format(long1);        System.out.println(sdate);        System.out.println(dtf.format(dt));        System.out.println(dtf1.format(dt));        System.out.println(dtf1.format(dt).toString());        // Date -> String        Date date = new Date(System.currentTimeMillis());        System.out.println(dtf.format(date));        // String -> Date        String timeString = "2018-08-11 11:44:27";        Date newDate = dtf.parse(timeString);        System.out.println(newDate);    }}

java 使用 new Date () 和 System.currentTimeMillis () 获取当前时间戳

java 使用 new Date () 和 System.currentTimeMillis () 获取当前时间戳

在开发过程中,通常很多人都习惯使用 new Date () 来获取当前时间,使用起来也比较方便,同时还可以获取与当前时间有关的各方面信息,例如获取小时,分钟等等,而且还可以格式化输出,包含的信息是比较丰富的。但是有些时候或许你并不需要获取那么多信息,你只需要关心它返回的毫秒数就行了,例如 getTime()。为了获取这个时间戳,很多人也喜欢使用 new Date ().getTime () 去获取,咋一看没什么问题,但其实没这个必要。

     其实看一下 java 的源码就知道了:

  public Date()
  {    this(System.currentTimeMillis());
  }

已经很明显了,new Date () 所做的事情其实就是调用了 System.currentTimeMillis()。如果仅仅是需要或者毫秒数,那么完全可以使用 System.currentTimeMillis() 去代替 new Date (),效率上会高一点。况且很多人喜欢在同一个方法里面多次使用 new Date (),通常性能就是这样一点一点地消耗掉,这里其实可以声明一个引用。

今天关于java.lang.System.currentTimeMillis替换方法的讲解已经结束,谢谢您的阅读,如果想了解更多关于calendar.getTimeInMillis() 和 System.currentTimeMillis() 的区别、java System.currentTimeMillis()毫秒值和具体日期值互相转换、Java 中时间处理 System.currentTimeMillis()、java 使用 new Date () 和 System.currentTimeMillis () 获取当前时间戳的相关知识,请在本站搜索。

本文标签: