如何检查日期(UTC格式)是在今天日期之前48小时

时间:2014-09-05 16:08:36

标签: java date

我尝试将今天的新日期对象转换为UTC。但是没有运气,因为新的日期对象总是在本地时区。我一直试图使用'before'方法验证两个日期。 date1是UTC格式。 date2今天。

以下代码始终以本地时区打印今天的日期对象。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
        String todayStr = sdf.format(new Date());// This string is in UTC. But I need date object in UTC.

        try {
            System.out.println(sdf.parse(todayStr));// This is still printing in local time zone.
        } catch (ParseException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }


    }

}

2 个答案:

答案 0 :(得分:4)

Date对象不在任何时区 - 它只是自Unix纪元以来毫秒数的包装器。 Unix时代通常以UTC(即1970年1月1日开始的午夜)来描述,但它实际上只是一个时间点。

要获得“now”之前48小时的时间点,您可以使用以下内容:

Date earlier = new Date(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(48));

您可以将其与任何Date对象进行比较,以查看更早出现的内容 - 再次提及任何特定时区。

(诚然,这不是一个容易测试的解决方案 - 我更喜欢在System.currentTimeMillis()接口后面抽象Clock,这样我就可以用我想要的假时钟进行测试。)

除非你需要一个字符串表示,否则忽略它 - 只要你想要一个字符串表示,你需要考虑你感兴趣的日历系统和时区。

请注意,您在问题中谈论“今天的日期” - 如果您指的是特定日期的开始,那么时区 相关,您需要做更多的工作。

最后,我建议如果可能,您可以使用Java 8中的java.time.*Joda Time而不是java.util.Date等。前两个都是很多比上一个更好的API。

  

以下代码始终以当地时区打印今天的日期对象。

是的,那是因为Date.toString()使用了本地时区。这就是它(不幸的是)的作用,并不意味着Date对象在“当地时区”。

答案 1 :(得分:0)

有关详细信息,请参阅correct answer by Jon Skeet

昨天和前一天

您的要求不清楚,但似乎您要测试目标日期时间字符串是否表示日期时间,该日期时间位于UTC时区定义的今天开始之前的48小时内。换句话说,昨天或前一天。

避免java.util.Date

避免使用与Java捆绑在一起的java.util.Date和.Calendar类。众所周知,它们很麻烦。而是在Java 8中使用Joda-Time或新的java.time(受Joda-Time启发)。与java.util.Date不同,这两个库都有一个知道自己分配的时区的日期时间类。

半开时间

两个库都有表示一段时间的类。比较由"半开放"完成。开始是包容性的并且结束排他性的方法。因此,您的两天时间被定义为昨天(包括在内)的第一个时刻,并且可以达到(但不包括)今天的第一个时刻(独家)。

ISO 8601

您的字符串格式由ISO 8601标准定义。 Joda-Time和java.time都使用ISO 8601作为解析和生成字符串的默认值。所以他们有一个内置的格式化程序来解析你的字符串。仅传递字符串。

不可变对象

Joda-Time使用immutable objects。不是修改(" mutate")现有对象,而是使用基于原始对象的值来实例化新对象。原因是thread-safety

约达时间

以下是Joda-Time 2.4。

中的一些示例代码
DateTime target = new DateTime( "2014-01-02T03:04:05.789Z", DateTimeZone.UTC );
DateTime nowUtc = DateTime.now( DateTimeZone.UTC );
DateTime today = nowUtc.withTimeAtStartOfDay();
DateTime dayBeforeYesterday = today.minusDays( 2 ).withTimeAtStartOfDay();
Interval interval = new Interval( dayBeforeYesterday, today ); // Half-Open.
boolean hit = interval.contains( target );