有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何设置带有时区的日历?

我试图将时间戳放入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

这是我正在寻找的结果,但我担心如果我在一台不在同一时区运行的机器上运行,我将无法获得一致的行为


共 (6) 个答案

  1. # 1 楼答案

    This is the result that I am looking for but I am concerned that if I am running on a machine that is not running in the same time zone

    这就是问题所在。内部表示应该可以,但它在本地时区打印:表示与实际内容不同

    使用SimpleDateFormathttp://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html并设置时区以查看所需区域上的日期

  2. # 2 楼答案

    为了进行比较,这里是相同类型的代码,但是使用了Joda-Time2.3

    避免使用java。util。日期&。日历类

    切勿在时区中使用三个字母的代码。它们既不是标准化的,也不是独特的。而是使用proper time zone names。在这种情况下,请使用“美国/纽约”或“美国/蒙特利尔”

    // 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
    
  3. # 3 楼答案

    Java日期对象表示自1970年1月1日00:00:00 GMT以来的毫秒数,因为其他方法已被弃用。直接“查看”日期对象的两种方法是“getTime()”和“toString()”(使用“dow mon dd hh:mm:ss zzz yyyy”)。因此,您正在将GMT值格式化为本地时区

    处理日期时,最好将其视为GMT值,然后在查看日期时将其视为“格式化”练习

  4. # 4 楼答案

    这里的问题是Java不知道时区“EDT”(东部夏时制)。因此,日历似乎将时区设置为GMT

    这里需要的时区是“美国/纽约”或“EST5EDT”。当使用这两个值中的任何一个时,都会产生正确的结果

    有效时区的列表可以通过调用TimeZone.getAvailableIDs()获得

    不幸的是,当未找到请求的时区时,不会生成警告

  5. # 5 楼答案

    如果可以取消java.util.Date,则可以使用joda时间API方便地根据需要设置这些值:

    对于查询,可以将已创建的日历实例作为构造函数参数设置为DateTime

    DateTime dt = new DateTime(cal);
    System.out.println(dt.toDateTimeISO());
    

    输出:

    2014-01-14T04:00:00.064-05:00
    
  6. # 6 楼答案

    Calendar.getTime()返回一个java.util.Date对象Date对象对时区一无所知。Calendar.getTime()返回的Date对象不知道它来自哪个时区

    打印Date对象时(例如,在打印时隐式调用toString()对象),它将在运行它的机器的默认时区中格式化

    如果要打印特定时区中的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()));