我尝试将今天的新日期对象转换为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();
}
}
}
答案 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标准定义。 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 );