在Java中使用各种日历时区(不使用Joda Time)

在Java中使用各种日历时区(不使用Joda Time),java,calendar,timezone,Java,Calendar,Timezone,我在寻找一种方法,根据用户输入获取不同时区的当前时间。我知道我可以用!但这是唯一的办法吗 Java中没有这样做的选项吗?我尝试了以下代码,它为所有3个sysout提供了相同的输出 Calendar pst = Calendar.getInstance(TimeZone.getTimeZone("PST")); System.out.println("PST " + pst.getTime()); Calendar ist = Calendar.getInstance(TimeZone.getTi

我在寻找一种方法,根据用户输入获取不同时区的当前时间。我知道我可以用!但这是唯一的办法吗

Java中没有这样做的选项吗?我尝试了以下代码,它为所有3个sysout提供了相同的输出

Calendar pst = Calendar.getInstance(TimeZone.getTimeZone("PST"));
System.out.println("PST " + pst.getTime());
Calendar ist = Calendar.getInstance(TimeZone.getTimeZone("Asia/Calcutta"));
System.out.println("IST " + ist.getTime());
Calendar utc = Calendar.getInstance(TimeZone.getTimeZone("Etc/UTC"));
System.out.println("UCT " + utc.getTime());

我在这里缺少什么来获取其他时区的当前时间?

是的,在每种情况下都会显示相同的值(或相隔毫秒),因为三个日历都引用相同的时间(尽管执行时间不同),而这就是
java.util.Date
所代表的全部内容。这是Calendar.getTime()的结果

但是,
Calendar
本身确实知道时区,这将在您使用
Calendar.get
等时反映出来。当您使用可以指定特定时区的
SimpleDateFormat
时,也将使用它

// Specify whatever format you want - bear in mind different locales etc
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
format.setTimeZone(calendar.getTimeZone());
String text = format.format(calendar.getTime());

现在还不清楚你到底想做什么,但基本上你需要知道哪些类型是时区感知的,哪些不是。了解
java.util.Date
没有格式、日历系统或时区是非常重要的:它只是自Unix纪元以来的毫秒数。

是的,这将在每种情况下(或相隔毫秒)显示相同的值,因为三个日历在时间上都指向同一个瞬间(尽管有执行时间)这就是
java.util.Date
表示的全部内容。这是
Calendar.getTime()
的结果

但是,
Calendar
本身确实知道时区,这将在您使用
Calendar.get
等时反映出来。当您使用可以指定特定时区的
SimpleDateFormat
时,也将使用它

// Specify whatever format you want - bear in mind different locales etc
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
format.setTimeZone(calendar.getTimeZone());
String text = format.format(calendar.getTime());

不清楚您到底想做什么,但基本上您需要知道哪些类型是时区感知的,哪些不是。了解
java.util.Date
没有格式、日历系统或时区非常重要:它只是Unix时代以来的毫秒数。

正如Jon所指出的那样out方法
getTime()
返回一个
java.util.Date
对象,该对象仅为毫秒值,不支持时区

如果您只是想打印时间,那么可以使用日历手动获取所需的字段

System.out.println(utc.get(Calendar.HOUR_OF_DAY) + ":" + utc.get(Calendar.MINUTE))

正如Jon指出的那样,
getTime()
方法返回一个
java.util.Date
对象,该对象只是一个毫秒值,不知道时区,因此需要在<10分钟内进行一些格式化

如果您只是想打印时间,那么可以使用日历手动获取所需的字段

System.out.println(utc.get(Calendar.HOUR_OF_DAY) + ":" + utc.get(Calendar.MINUTE))


这将需要一分钟<10的格式来显示0

,感谢您的回复。我正在尝试获取不同时区的当前时间。例如:印度、德国、美国(当地时间)@AnanthChelladurai:但是你想用这些时间做什么呢?你已经在你展示的代码中,在
日历
对象中得到了这些时间-只是你要从每个对象中提取一个
日期
。我正在尝试为不同时区的用户创建多个订单。例如:1个德语订单和1个fo订单r印度用户。为订单1和订单2创建的日期时间应该在各自的时区内。@AnanthChelladurai:确实如此,正如我已经多次说过的。你还没有说你想用这些
日历
对象做什么。正如我所说,对它们调用
getTime
并不是你想要的…@AnanthChelladurai:所以,正如我在原始答案中所说的,请使用
SimpleDataFormat
。我将编辑答案以演示这一点。感谢您的回复。我正在尝试获取不同时区的当前时间。例如:印度、德国、美国(当地时间)@AnanthChelladurai:但是你想用这些时间做什么呢?你已经在你展示的代码中,在
日历
对象中得到了这些时间-只是你要从每个对象中提取一个
日期
。我正在尝试为不同时区的用户创建多个订单。例如:1个德语订单和1个fo订单r印度用户。为订单1和订单2创建的日期时间应该在各自的时区内。@AnanthChelladurai:确实如此,正如我已经多次说过的。你还没有说你想用这些
日历
对象做什么。正如我所说,对它们调用
getTime
并不是你想要的…@A因此,我将在我的原始答案中使用<代码> SimpleDateFormat <代码>。我将编辑答案来证明它。值得考虑的是,我认为对于很多用例,人们应该考虑使用JoDaTi,不是因为Java有java的特性,而是因为java日历/日期/ API等是很难正确使用的。我们中的一些人在环境中受到内部限制的限制,没有在JoDA时间罐中浪费的真正的兴趣。我真的很期待JDK 8。我知道它将有一个新的java时间API,基于JoDA时间。它是JSR 310。对于它来说,我认为对于很多用例,我们应该考虑使用JordaMn。ot是因为它有Java没有的功能,而是因为Java日历/日期/等等。API…最多很难正确使用。我们中的一些人受到环境内部限制的限制,不能奢侈地进入Joda Time jar。非常期待JDK 8。我知道它将有一个新的Java Time API,ba在Joda Time上使用。它是JSR 310。或者你可以使用
SimpleDateFormat
,这个轮子已经被发明用于这个目的了…@DavidWallace:我希望能够在评论中编辑这样一句话:“我说了你想说的一切,就在你做之前。。。