日期对象中Java中从BST到IST的日期转换

时间:2016-08-23 07:19:03

标签: java android date

我有一个场景,即我的系统时区是什么,我必须在日期对象的IST中打印,不在字符串。这是我的下面的代码。

public static void main(String[] args) throws ParseException {
    Date now = new Date();
    DateFormat sdf = new SimpleDateFormat("yyyy:MM:dd-HH:mm:ss");
     sdf.setTimeZone(TimeZone.getTimeZone("IST"));
     String txnDateTime = sdf.format(now); 
      sdf.setTimeZone(TimeZone.getTimeZone("IST"));
     System.out.println("Date ::: "+txnDateTime);

     Date n = null;
     n = sdf.parse(txnDateTime);
     System.out.println("Date format ::: "+n);

}

我的输出如下:

In String : I am getting as Expected : 2016:08:23-12:46:59 IST Timing
In Date : I am still getting BST Time : Tue Aug 23 08:16:59 BST 2016

我期待在2016年8月23日星期二12:46:59来到日期。

任何帮助都将不胜感激。

提前致谢。

3 个答案:

答案 0 :(得分:5)

Date.toString()使用您的JVM的默认时区,因为Date实际上没有明确的时区 - 它实际上只是一个几毫秒的包装器。

您必须使用带有明确时区的DateFormat进行打印,才能在特定时区内打印Date

答案 1 :(得分:1)

TL;博士

ZonedDateTime.now( ZoneId.of( "India/Kolkata" ) )

UTC中的服务器

您的服务器通常应设置为UTC时间。但你永远不应该依赖它。始终明确指定所需/预期的时区。

字符串!=日期时间

正如其他人解释的那样,不要将日期时间值与其String表示形式混淆。日期时间对象可以解析字符串,并且可以生成字符串,但它们与字符串不同且独立。日期时间对象一个字符串。

避免旧的日期时间类

您正在使用现在由java.time类取代的麻烦的旧旧日期时间类。

使用java.time

从评论中可以看出,您只是要求在India time zone中捕获当前时刻。如今印度的时间比UTC提前了五个半小时。

指定proper time zone name永远不要使用诸如ESTIST 之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "India/Kolkata" );
ZonedDateTime zdt = ZonedDateTime.now( z );

如果您希望将此时刻调整为UTC,只需提取Instant,这是时间轴上的一个时刻,始终为UTC。使用Instant对象进行日志记录,数据存储和数据交换(一般来说)。

Instant instant = zdt.toInstant();

要生成表示标准ISO 8601格式的日期时间值的字符串,只需拨打toString

您可以生成任何所需格式的字符串。但通常最好让java.time自动本地化。只需指定适当的Locale来表示(a)用于翻译的人类语言,以及(b)用于决定诸如大写,缩写和标点符号等问题的文化规范。

Locale l = Locale.CANADA_FRENCH ;  // Or Locale.US, Locale.ITALY, etc.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( l );
String output = zdt.format( f );

请注意,Locale nothing 与时区有关。在这里,我们将采用印度目前的wall-clock time并以Québécois人预期的格式显示。

转换

虽然你应该避免旧的旧日期时间类,因为它们的混乱,糟糕的设计和缺陷,有时你可能需要与尚未更新为java.time类型的旧代码进行互操作。对于这种情况,您可以通过调用添加到旧类的新方法来转换为/从java.time转换。

java.util.Date utilDate = java.util.Date.from( zdt.toInstant() );

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date.Calendar和& java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter等。

答案 2 :(得分:1)

  

我期待在2016年8月23日星期二12:46:59来到日期。“

序列字母T-u-e ... 是一个字符串。它不是Date对象。 Date类本身没有时区概念。时区存储在Locale对象中。在您使用DateStringtoString()转换为SimpleDateFormat之前,此时区设置无意义。

  

当我使用格式而不是解析时,我以String对象的形式获得转换时间,我对此不感兴趣。我有兴趣只在Date Object中获取时间。

这是不可能的。当您将Date对象解析为可以显示的String时,时区才有意义。

要解决您的问题,您需要使用SimpleDateFormat并添加逻辑以确定在生成String输出时使用哪个时区。