有没有可以使用时间戳的高性能java库?

有没有可以使用时间戳的高性能java库?,java,performance,datetime,timestamp,Java,Performance,Datetime,Timestamp,我正在寻找高性能Java库,该库提供的方法允许我获得: 当前小时数(0-24) 当日(1-31) 本周(1-52) 当月(1-12) 本季(1-4) 本年度(年或年) 对我来说,表现是一个最重要的问题。这就是为什么我不能使用标准日历类。最好的解决方案是在不创建新对象的情况下进行所有计算 补充:为了澄清,我再提一次:每秒超过100000次操作。你确定日历太慢还是你相信它?你测量它了吗 用Java创建新对象非常便宜。留着它们是很昂贵的 也就是说,可以尝试将Java代码中的算法复制到静态助手方法中。您

我正在寻找高性能Java库,该库提供的方法允许我获得:

  • 当前小时数(0-24)
  • 当日(1-31)
  • 本周(1-52)
  • 当月(1-12)
  • 本季(1-4)
  • 本年度(年或年)
  • 对我来说,表现是一个最重要的问题。这就是为什么我不能使用标准日历类。最好的解决方案是在不创建新对象的情况下进行所有计算


    补充:为了澄清,我再提一次:每秒超过100000次操作。

    你确定
    日历
    太慢还是你相信它?你测量它了吗

    用Java创建新对象非常便宜。留着它们是很昂贵的


    也就是说,可以尝试将Java代码中的算法复制到静态助手方法中。

    您确定
    Calendar
    太慢了,还是相信它?你测量它了吗

    用Java创建新对象非常便宜。留着它们是很昂贵的


    也就是说,可以尝试将Java代码中的算法复制到静态助手方法中。

    只使用一个对象,然后按如下方式更新:

    Date d = new Date();
    ...
    d.setTime(System.currentTimeMillis());
    

    仅使用一个对象并按如下方式更新它的时间:

    Date d = new Date();
    ...
    d.setTime(System.currentTimeMillis());
    
    您可以使用,如果不满意,您可以使用

    这可以帮助您解决问题。

    您可以使用,如果不满意,您可以使用

    这可以帮助您解决问题。

    您可以使用它,因为它比日历快得多,请执行以下操作:

    LocalDateTime now = new LocalDateTime(); // automatically points to current datetime.
    int hour = now.getHourOfDay();
    int day = now.getDayOfMonth();
    int week = now.getWeekOfWeekyear();
    int month = now.getMonthOfYear();
    int year = now.getYear();
    int season = getSeason(day, month);
    
    getSeason()易于实现。没有一种解决方案可以在不创建任何对象的情况下完成所有这一切。顺便问一下,你为什么需要这么多的表现

    您可以使用,因为它比日历快得多,请执行以下操作:

    LocalDateTime now = new LocalDateTime(); // automatically points to current datetime.
    int hour = now.getHourOfDay();
    int day = now.getDayOfMonth();
    int week = now.getWeekOfWeekyear();
    int month = now.getMonthOfYear();
    int year = now.getYear();
    int season = getSeason(day, month);
    

    getSeason()易于实现。没有一种解决方案可以在不创建任何对象的情况下完成所有这一切。顺便问一下,你为什么需要这么多的表现

    您可以获得当前时间,并通过除法和余数计算当前小时、分钟、秒、毫秒。日、月、年每天只改变一次,所以你只需要在它改变时计算它

    您可以使用缓存的日/月/年,以亚微秒的时间计算剩余时间,而无需创建对象(每天不止一次)


    关于夏令时的变化是如何发生的,有各种各样的假设。您可能需要更改检查周期以满足您的需要。

    您可以获取当前时间并通过除法和余数计算当前小时、分钟、秒、毫秒。日、月、年每天只改变一次,所以你只需要在它改变时计算它

    您可以使用缓存的日/月/年,以亚微秒的时间计算剩余时间,而无需创建对象(每天不止一次)


    关于夏令时的变化是如何发生的,有各种各样的假设。您可能需要更改检查周期以满足您的需要。

    请注意这相当昂贵,但通常可以通过调用该方法一次并重新使用来获取日历对象(除非您需要每个线程的日历:日历不是线程安全的)。

    请注意这相当昂贵,但是您通常可以通过调用该方法一次并重用来获取日历对象(除非您需要每个线程使用日历:日历不是线程安全的)。

    您实际上可以使用excellant joda时间库来实现这一点。joda中的
    年表
    实现提供了DateTime
    getHour
    getDay
    类型方法背后的逻辑。如果希望跳过创建
    DateTime
    实例,那么直接使用它没有问题

    long msSinceEpoch = System.currentTimeMillis();
    
    Chronology chronology = ISOChronology.getInstanceUTC() // This can be static
    
    chronology.hourOfDay().get(msSinceEpoch);
    chronology.dayOfMonth().get(msSinceEpoch);
    chronology.weekOfWeek().get(msSinceEpoch);
    chronology.monthOfYear().get(msSinceEpoch);
    chronology.years().get(msSinceEpoch);
    
    会话不是joda的概念。根据你自己的规则,你必须从下个月算起


    请参见

    您实际上可以使用excellant joda时间库来执行此操作。joda中的
    年表
    实现提供了DateTime
    getHour
    getDay
    类型方法背后的逻辑。如果希望跳过创建
    DateTime
    实例,那么直接使用它没有问题

    long msSinceEpoch = System.currentTimeMillis();
    
    Chronology chronology = ISOChronology.getInstanceUTC() // This can be static
    
    chronology.hourOfDay().get(msSinceEpoch);
    chronology.dayOfMonth().get(msSinceEpoch);
    chronology.weekOfWeek().get(msSinceEpoch);
    chronology.monthOfYear().get(msSinceEpoch);
    chronology.years().get(msSinceEpoch);
    
    会话不是joda的概念。根据你自己的规则,你必须从下个月算起


    请看

    我已经读了很多关于Joda Time的帖子,所以现在我终于下载并尝试了一下

    加雷思·戴维斯的回答已经被接受,我对此没有异议。但我很想知道乔达时代在哪里起了作用

    基于这个问题和公认的答案,我制作了一个类来比较JDK日历和Joda时间年表的执行时间

    我发现日历实现的运行速度始终更快,而不是原来的两倍

    import java.util.Calendar;
    import java.util.Date;
    
    import org.joda.time.Chronology;
    import org.joda.time.chrono.ISOChronology;
    
    
    public class CalendarTest {
    
        private static final int ITERATIONS = 1000000;
    
        public static void main(String[] args) {
            for (int i = 0; i < 10; i++) {
                jdkCalendar();
                jodaChronology();
            }
        }
    
        private static void jdkCalendar() {
            long start = System.currentTimeMillis();
            Calendar c = Calendar.getInstance();
            int hourOfDay = 0;
            int dayOfMonth = 0;
            int weekOfYear = 0;
            int month = 0;
            int year = 0;
            for (int i = 0; i < ITERATIONS; i++) {
                c.setTimeInMillis(System.currentTimeMillis());
                hourOfDay = c.get(Calendar.HOUR_OF_DAY);
                dayOfMonth = c.get(Calendar.DAY_OF_MONTH);
                weekOfYear = c.get(Calendar.WEEK_OF_YEAR);
                month = c.get(Calendar.MONTH);
                year = c.get(Calendar.YEAR);
            }
            long duration = System.currentTimeMillis() - start;
            System.err.printf("jdk:  duration %d, hourOfDay: %d, dayOfMonth: %d, weekOfYear: %d, month: %d, year: %d\n", duration, hourOfDay, dayOfMonth, weekOfYear, month, year);
        }
    
        private static void jodaChronology() {
            long start = System.currentTimeMillis();
            Chronology chronology = ISOChronology.getInstanceUTC(); // This can be static
            int hourOfDay = 0;
            int dayOfMonth = 0;
            int weekOfYear = 0;
            int month = 0;
            int year = 0;
            for (int i = 0; i < ITERATIONS; i++) {
                long msSinceEpoch = System.currentTimeMillis();
                hourOfDay = chronology.hourOfDay().get(msSinceEpoch);
                dayOfMonth = chronology.dayOfMonth().get(msSinceEpoch);
                weekOfYear = chronology.weekOfWeekyear().get(msSinceEpoch);
                month = chronology.monthOfYear().get(msSinceEpoch);
                year = chronology.years().getValue(msSinceEpoch);
            }
            long duration = System.currentTimeMillis() - start;
            System.err.printf("joda: duration %d, hourOfDay: %d, dayOfMonth: %d, weekOfYear: %d, month: %d, year: %d\n", duration, hourOfDay, dayOfMonth, weekOfYear, month, year);
        }
    
    }
    

    我已经读了很多关于Joda Time on的帖子,所以现在我终于下载并尝试了一下

    加雷思·戴维斯的回答已经被接受,我对此没有异议。但我很想知道乔达时代在哪里起了作用

    基于这个问题和公认的答案,我制作了一个类来比较JDK日历和Joda时间年表的执行时间

    我发现日历实现的运行速度始终更快,而不是原来的两倍

    import java.util.Calendar;
    import java.util.Date;
    
    import org.joda.time.Chronology;
    import org.joda.time.chrono.ISOChronology;
    
    
    public class CalendarTest {
    
        private static final int ITERATIONS = 1000000;
    
        public static void main(String[] args) {
            for (int i = 0; i < 10; i++) {
                jdkCalendar();
                jodaChronology();
            }
        }
    
        private static void jdkCalendar() {
            long start = System.currentTimeMillis();
            Calendar c = Calendar.getInstance();
            int hourOfDay = 0;
            int dayOfMonth = 0;
            int weekOfYear = 0;
            int month = 0;
            int year = 0;
            for (int i = 0; i < ITERATIONS; i++) {
                c.setTimeInMillis(System.currentTimeMillis());
                hourOfDay = c.get(Calendar.HOUR_OF_DAY);
                dayOfMonth = c.get(Calendar.DAY_OF_MONTH);
                weekOfYear = c.get(Calendar.WEEK_OF_YEAR);
                month = c.get(Calendar.MONTH);
                year = c.get(Calendar.YEAR);
            }
            long duration = System.currentTimeMillis() - start;
            System.err.printf("jdk:  duration %d, hourOfDay: %d, dayOfMonth: %d, weekOfYear: %d, month: %d, year: %d\n", duration, hourOfDay, dayOfMonth, weekOfYear, month, year);
        }
    
        private static void jodaChronology() {
            long start = System.currentTimeMillis();
            Chronology chronology = ISOChronology.getInstanceUTC(); // This can be static
            int hourOfDay = 0;
            int dayOfMonth = 0;
            int weekOfYear = 0;
            int month = 0;
            int year = 0;
            for (int i = 0; i < ITERATIONS; i++) {
                long msSinceEpoch = System.currentTimeMillis();
                hourOfDay = chronology.hourOfDay().get(msSinceEpoch);
                dayOfMonth = chronology.dayOfMonth().get(msSinceEpoch);
                weekOfYear = chronology.weekOfWeekyear().get(msSinceEpoch);
                month = chronology.monthOfYear().get(msSinceEpoch);
                year = chronology.years().getValue(msSinceEpoch);
            }
            long duration = System.currentTimeMillis() - start;
            System.err.printf("joda: duration %d, hourOfDay: %d, dayOfMonth: %d, weekOfYear: %d, month: %d, year: %d\n", duration, hourOfDay, dayOfMonth, weekOfYear, month, year);
        }
    
    }
    

    每次在调用字段的getter之前需要创建
    DateTime
    类的实例时,我建议使用JodaTime。但当您调用getter方法多于创建实例时,最好使用JDK 8中的java.time库或backport

    这是因为JodaTime的
    DateTime
    类只存储一个
    long iMillis
    ,因为从新纪元开始,某些字段的所有getter,如minuteOfHour、dayOfMonth,总是从头开始计算该值。但是java.time的
    ZonedDateTime
    将这些字段存储在单独的变量中,例如:
    int year、short month、short da