我有一个时间戳,我试图放入Date
对象,但是当我使用Calendar时,我遇到了一个奇怪的问题。我似乎无法使用我想要的值创建Date对象:
public static void main(String args[]){
Date today = new Date();
int hour = 4, min=0, sec=0, ms=64;
Calendar cal = GregorianCalendar.getInstance();
cal.clear();
cal.setTimeZone(TimeZone.getTimeZone("EDT"));
cal.setTime(today);
cal.set(Calendar.HOUR_OF_DAY,hour);
cal.set(Calendar.MINUTE,min);
cal.set(Calendar.SECOND,sec);
cal.set(Calendar.MILLISECOND,ms);
System.out.println("Time is: "+cal.getTime());
}
这会产生:
Time is: Mon Jan 13 23:00:00 EST 2014
不 我要找的结果。
但是,如果我注释掉'setTimeZone'方法调用,我会得到以下结果:
Time is: Tue Jan 14 04:00:00 EST 2014
这是我正在寻找的结果,但我担心如果我在不在同一时区运行的机器上运行,我将无法获得一致的行为。
答案 0 :(得分:2)
这是我正在寻找的结果,但我担心如果我在没有在同一时区运行的机器上运行
这是问题所在。内部表示应该没问题,但它会在当地时区打印:表示与实际内容不同。
使用SimpleDateFormat
http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html并设置TimeZone以查看所需区域的日期。
答案 1 :(得分:1)
这里的问题是Java不知道时区“EDT”(东部夏令时)。因此,日历似乎将时区设置为GMT。
这里需要的时区是“America / New_York”或“EST5EDT”。当使用这些值中的任何一个时,都会产生正确的结果。
可以通过调用TimeZone.getAvailableIDs()
不幸的是,如果找不到请求的时区,则不会产生任何警告。
答案 2 :(得分:0)
如果您可以取消使用java.util.Date
,则可以使用joda时间API根据需要方便地设置这些值:
对于您的查询,您可以将已创建的Calendar实例设置为DateTime
的构造函数参数。
DateTime dt = new DateTime(cal);
System.out.println(dt.toDateTimeISO());
<强>输出:强>
2014-01-14T04:00:00.064-05:00
答案 3 :(得分:0)
Calendar.getTime()
会返回java.util.Date
个对象。 Date
个对象对时区一无所知。 Date
返回的Calendar.getTime()
对象不知道它所来自的Calendar
到哪个时区。
当您打印Date
对象时(例如,通过隐式调用toString()
对象,正如您所做的那样),它将在您运行它的计算机的默认时区中进行格式化。 / p>
如果要在特定时区打印Date
,请使用SimpleDateFormat
,并在SimpleDateFormat
对象上设置所需的时区。例如:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
df.setTimeZone(TimeZone.getTimeZone("EDT"));
// Will display the date that the calendar is set to in the EDT timezone
System.out.println(df.format(cal.getTime()));
答案 4 :(得分:0)
Java Date对象表示自1970年1月1日00:00:00 GMT以来的毫秒秒数,因为其他方法已被弃用。直接“查看”Date对象的两种方法是“getTime()”和“toString()”(使用“dow mon dd hh:mm:ss zzz yyyy”)。因此,您要将GMT值格式化为您当地的时区。
使用日期时,最好将它们视为GMT值,然后在查看日期时将其视为“格式化”练习。
答案 5 :(得分:0)
为了比较,这是相同类型的代码,但使用Joda-Time 2.3。
避免使用java.util.Date&amp; .Calendar类。
切勿对时区使用三字母代码。它们既不标准也不独特。而是使用proper time zone names。在这种情况下,请使用“America / New_York”或“America / Montreal”。
// Use time zone names, such as from this slightly outdated list: http://joda-time.sourceforge.net/timezones.html
DateTimeZone timeZone = DateTimeZone.forID( "America/New_York" );
// Input.
int hour = 4, min = 0, sec = 0, ms = 64;
// Start with now, then adjust the time of day.
DateTime now = new DateTime( timeZone );
DateTime dateTime = now.withHourOfDay( hour ).withMinuteOfHour( min ).withSecondOfMinute( sec ).withMillisOfSecond( ms );
// If needed, translate to a java.util.Date for use with other classes.
java.util.Date date = dateTime.toDate();
转储到控制台...
System.out.println( "now: " + now );
System.out.println( "dateTime: " + dateTime );
System.out.println( "date: " + date );
跑步时......
now: 2014-01-20T21:04:51.237-05:00
dateTime: 2014-01-20T04:00:00.064-05:00
date: Mon Jan 20 01:00:00 PST 2014