我正在比较两个日期和时间,但它没有按预期工作。请帮帮我。
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;
}
}
答案 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格式。
在解析和生成日期时间值的文本表示时,默认情况下Joda-Time和java.time都使用ISO 8601格式。所以甚至不需要定义解析模式。只需将这些字符串提供给Joda-Time中DateTime
的构造函数或java.time中的等效构造函数。
您正在使用旧的日期时间类,这些类已被证明设计不佳且很麻烦。避免它们。
而是使用java.time或其过时的前任Joda-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 directly到Instant
个对象。 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 );
您还可以与equals
,isBefore
和isAfter
方法进行比较。
提示: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 ) ;