Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何设置带有时区的日历?_Java_Java.util.calendar - Fatal编程技术网

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

Java 如何设置带有时区的日历?,java,java.util.calendar,Java,Java.util.calendar,我有一个时间戳,我正试图将它放入日期对象中,但是当我使用日历时,我遇到了一个奇怪的问题。我似乎无法创建具有所需值的日期对象: 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.

我有一个时间戳,我正试图将它放入
日期
对象中,但是当我使用日历时,我遇到了一个奇怪的问题。我似乎无法创建具有所需值的日期对象:

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

这是我正在寻找的结果,但我担心如果我在一台不在同一时区运行的机器上运行

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


使用
SimpleDateFormat
并设置时区以查看所需区域上的日期。

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

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

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

2014-01-14T04:00:00.064-05:00
Calendar.getTime()
返回
java.util.Date
对象<代码>日期对象对时区一无所知。
Date
对象返回的
Calendar.getTime()
不知道它来自哪个时区

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

如果要在特定时区中打印
日期
,请使用
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()));

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


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

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

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

通过调用
TimeZone.getAvailableIDs()


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

为了进行比较,这里是相同类型的代码,但使用2.3

避免使用java.util.Date和.Calendar类

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

//使用时区名称,例如从这个稍微过时的列表中:http://joda-time.sourceforge.net/timezones.html
DateTimeZone timeZone=DateTimeZone.forID(“美国/纽约”);
//输入。
整小时=4,分钟=0,秒=0,毫秒=64;
//从现在开始,然后调整一天的时间。
DateTime now=新的日期时间(时区);
DateTime DateTime=now.withHourOfDay(小时)、withMinuteOfHour(分钟)、withSecondOfMinute(秒)、withMillisOfSecond(毫秒);
//如果需要,将其转换为java.util.Date以便与其他类一起使用。
java.util.Date Date=dateTime.toDate();
转储到控制台

System.out.println(“now:+now”);
System.out.println(“dateTime:+dateTime”);
系统输出打印项次(“日期:+日期);
当运行时

现在:2014-01-20T21:04:51.237-05:00
日期时间:2014-01-20T04:00:00.064-05:00
日期:2014年1月20日星期一01:00:00太平洋标准时间

没有。SimpleDateFormat(“EEE MMM dd HH:mm:ss zzz yyyy”)生成相同的结果。是否设置了SimpleDateFormat的时区?它使用JVM时区!