如何使用毫秒存储日期并使用java中的集合进行排序

时间:2016-06-20 00:16:00

标签: java sorting date simpledateformat comparator

在我的用例中,我想将日期存储在一个对象中,并根据java中的日期[自定义比较器]对对象进行排序。我尝试了以下代码,

    class Tweet implements Comparable<Tweet>{
        int tweetId;
        Date dateTime;

        public Tweet(int tweetId, Date dateTime)
        {
            this.tweetId = tweetId;
            this.dateTime = dateTime;
        }

        public Date getDateTime()
        {
            return dateTime;
        }

        public int getTweetId()
        {
            return tweetId;
        }

        @Override
        public int compareTo(Tweet o)
        {
            if (getDateTime() == null || o.getDateTime() == null)
                return 0;
            return getDateTime().compareTo(o.getDateTime());
        }
    }

    public class ApplicationObj
    {
        /** Compose a new tweet. */
        public void postTweet(int userId, int tweetId) {
            Date date = new Date();
            User user;
            Date dTime = new Date();
            try {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
                String dateTime = sdf.format(date);
                dTime = sdf.parse(dateTime);
            } catch (ParseException  e)
            {
                ;
            }
            if(!userMap.containsKey(userId))
            {
                user = new User(userId);
                userMap.put(userId, user);
            } else {
                user = userMap.get(userId);
            }
            ArrayList<Tweet> tweets = user.getTweets();
            tweets.add(new Tweet(tweetId, dTime));
        }

     public List<Integer> getNewsFeed(int userId) {
        if(!userMap.containsKey(userId))
        {
            return new ArrayList<Integer>();
        }
        User user = userMap.get(userId);
        ArrayList<Tweet> newsFeedTweets = new ArrayList<Tweet>();
        ArrayList<Tweet> userTweets = user.getTweets();
        Set<User> followers = user.getFollowers();
        ArrayList<Tweet> followersTweets = getFollowersTweets(followers);

        newsFeedTweets.addAll(userTweets);
        newsFeedTweets.addAll(followersTweets);

        Collections.sort(newsFeedTweets, new Comparator<Tweet>() {
          public int compare(Tweet o1, Tweet o2) {
            if (o1.getDateTime() == null || o2.getDateTime() == null)
                return 0;
            return o2.getDateTime().compareTo(o1.getDateTime());
          }
        });

        ArrayList<Tweet> newsFeed;
        if(newsFeedTweets.size() > 10)
        {
            newsFeed = new ArrayList<Tweet>(newsFeedTweets.subList(0,10));
        }else {
            newsFeed = newsFeedTweets;
        }

        for(Tweet tweet : newsFeed)
        {
            System.out.println("id "+tweet.getTweetId());
        }
        return getTweetIds(newsFeed);
    }

 }

我试图用简单的日期格式解析后用毫秒存储日期。

但它不起作用。有人可以帮我这个吗?

3 个答案:

答案 0 :(得分:2)

  

但它不起作用。有人可以帮我这个吗?

很可能你在这里收到错误。

   try {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        String dateTime = sdf.format(date);
        dTime = sdf.parse(dateTime);
    } catch (ParseException  e)
    {
        ;
    }

但你忽略了;行。我建议你至少打印出错误。将该行;替换为记录或调用System.out.println( e );

答案 1 :(得分:2)

你的代码中有很多不必要的行,我认为这些行是从不同的尝试中遗留下来的,所以最好先清理它。

你为Tweet类实现了类似的接口,但是使用Tweet类的compare方法,你正在使用另一个比较器。

Collections.sort(newsFeedTweets, new Comparator<Tweet>() {
          public int compare(Tweet o1, Tweet o2) {
            if (o1.getDateTime() == null || o2.getDateTime() == null)
                return 0;
            return o2.getDateTime().compareTo(o1.getDateTime());
          }
        });

上面的代码和Tweet.compare方法的行为不同,一个是asc,另一个是desc。  你可能想用

 Collections.sort(newsFeedTweets);

而不是内联比较器。

答案 2 :(得分:1)

在评论中,您要求更好地记录对象的当前时间。

更好的方法是避免使用与最早版本的Java捆绑在一起的臭名昭着的旧日期时间类。

java.time

而是使用Java 8及更高版本中内置的java.time框架。见Oracle Tutorial。许多功能都是back-ported to Java 6 & 7,还有adapted to Android

Instant

Instant类代表UTC中时间轴上的当前时刻,分辨率为nanoseconds。通常最好在业务逻辑,存储和日志记录中内部使用UTC。仅在需要时应用时区(ZoneIdZonedDateTime),以便向用户显示。

Instant instant = Instant.now();

Tweet班级上,定义一个如下的成员变量:

Instant whenTweeted;

字符串

在解析/生成字符串以表示日期时间值时,java.time类使用标准ISO 8601格式。最后的ZZulu的缩写,表示“UTC”。

  

instant.toString()→2016-06-18T12:34:56.789Z

分辨率

关于解决方案,在Java 8中,由于依赖Clock的遗留实现,当前时刻仅被捕获高达毫秒的分辨率(最多3个小数秒的小数位)。在Java 9中,当前时刻以高达纳秒的分辨率(最多9位小数)捕获,具体取决于计算机硬件时钟的能力。

排序

要进行排序,请使用Instant中内置的Comparator方法定义compareTo

保持简单

因此不需要解析字符串或从问题中尝试获得毫秒数 - 来自 - epoch。解决方案比这简单得多。

搜索Stack Overflow以获取更多关于java.time的讨论和示例。