Java中的日期和时间比较

时间:2015-05-09 05:38:50

标签: java android

我正在比较两个日期和时间,但它没有按预期工作。请帮帮我。

import java.util.*;
import java.lang.*;
import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Date date1=convertStringToDate("2015-05-03T17:11:00Z");
        Date date2=convertStringToDate("2015-05-08T22:02:20Z");
        System.out.println("Date2:"+date1.compareTo(date2));//output 1

        Date date3=convertStringToDate("2015-05-08T21:15:29Z");
        System.out.println("Date3:"+date1.compareTo(date3));//output -1

        Date date4=convertStringToDate("2015-05-08T19:22:25Z");
        System.out.println("Date4:"+date1.compareTo(date4));//output -1

        Date date5=convertStringToDate("2015-05-08T16:46:31Z");
        System.out.println("Date5:"+date1.compareTo(date5));//output 1

        Date date6=convertStringToDate("2015-05-08T15:48:02Z");
        System.out.println("Date6:"+date1.compareTo(date6));//output 1


    }

     static  Date convertStringToDate(String input){

        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-mm-dd'T'HH:MM:SS'Z'");
        Date date = null;
        try {
            date = formatter.parse(input);

        } catch (ParseException e) {
            e.printStackTrace();
        }


        return  date;
    }
}

2 个答案:

答案 0 :(得分:4)

根据您的考试日期,您传递给String构造函数的格式SimpleDateFormat似乎已将小写和大写m混合在一起。从the docs开始,大写M表示月份字符,而小写m表示分钟。此外,您可能需要小写s ,而不是大写S' s,表示小数秒人物。

您想要的格式似乎是"yyyy-MM-dd'T'HH:mm:ssZ"

答案 1 :(得分:0)

交换m个字母

评论是正确的,您需要通过交换大写和小写m字母来修复格式模式。

更好的是,通过完全避免使用java.util.Date和.Calendar类来节省很多痛苦。

ISO 8601

您的输入字符串采用标准ISO 8601格式。

在解析和生成日期时间值的文本表示时,默认情况下Joda-Time和java.time都使用ISO 8601格式。所以甚至不需要定义解析模式。只需将这些字符串提供给Joda-Time中DateTime的构造函数或java.time中的等效构造函数。

避免旧的日期时间类

您正在使用旧的日期时间类,这些类已被证明设计不佳且很麻烦。避免它们。

而是使用java.time或其过时的前任Joda-Time

java.time

java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date.Calendar和& java.text.SimpleDateFormat

现在在maintenance mode中,Joda-Time项目还建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。

解析为Instant

Parse directlyInstant个对象。 Instant是UTC时间轴上的一个时刻,分辨率为nanosecond

Instant a = Instant.parse( "2015-05-03T17:11:00Z" );
Instant b = Instant.parse( "2015-05-08T22:02:20Z" );

与通常的compareTo方法进行比较。

int comparison = a.compareTo( b );

您还可以与equalsisBeforeisAfter方法进行比较。

提示:ISO 8601字符串可能有小数秒,带点(句点)或逗号作为小数点。默认情况下,java.time类支持点,因此您可能希望用点替换任何逗号。

Instant a = Instant.parse( "2015-05-03T17:11:00,123456789Z".replace( "," , "." ) );

约达时间

DateTime dateTime_1 = new DateTime( "2015-05-03T17:11:00Z" , DateTimeZone.UTC ) ;
…
Boolean isEarlier = dateTime_.isBefore( dateTime_2 ) ;