时区解析后的字符串到日期转换问题

时间:2017-03-31 10:43:37

标签: java date

我正在尝试将日期转换为指定的时区并返回转换后的日期。但代码总是返回未转换的日期。可以任何帮助。

public static Date testUserSpecifiedConv(String toTimezone, Date inputDate) {
        System.out.println(inputDate);
        Date convertedDate = null;
        String inputDateStr ;
        DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        df.setTimeZone(TimeZone.getTimeZone(toTimezone));           

        inputDateStr = df.format(inputDate);

        System.out.println("Formatted Date In String Format: " + inputDateStr);
        //Now trying to convert it back to date
        try {
            convertedDate = df.parse(inputDateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return convertedDate;
    }

    public static void main(String args[]) {
        System.out.println("Formatted Date In Date Format: "+testUserSpecifiedConv("EST", new Date()));   
    }

输出

Fri Mar 31 15:58:50 IST 2017
Formatted Date In String Format: 03/31/2017 05:28:50
Formatted Date In Date Format: Fri Mar 31 15:58:50 IST 2017

输出中字符串和日期格式的格式化日期不同。

3 个答案:

答案 0 :(得分:2)

班级java.util.Date确实代表一个特定的时间点,并且本身与时区无关。

尽管如此,您可以将时区应用于SimpleDateFormat以相应地格式化您的日期,以便在特定时区显示(例如,如果您希望在某处显示格式化的字符串)。

但是,如果现在解析格式化日期,日期对象本身将不再包含有关时区的任何信息。

如果您想在对象级别使用时区,可以查看ZonedDateTime

<强>更新
假设您要将给定的String转换为包含某个时区中日期信息的对象,您可以这样做:

ZonedDateTime dateTime = ZonedDateTime.parse("2007-12-03T10:15:30+01:00[Europe/Paris]");

答案 1 :(得分:1)

日期实例不保留任何格式信息。有关详细信息,请查看Stackoverflow question。您将通过更好地了解Date对象来获得答案。

答案 2 :(得分:0)

java.time

Answer by JDC有正确的想法。

我将展示如何使用现代java.time类来取代应该避免的麻烦的旧遗留日期时间段(DateCalendar等)。

首先,你的两个论点。

  • 传递ZoneId个对象,而不仅仅是字符串。这样做可以提供类型安全性,确保有效值,并使您的代码更加自我记录。
  • Date已过时,转换为Instant并转而通过。

对于时区,请指定continent/region格式为Pacific/Auckland,例如proper time zone nameAmerica/MontrealEST。切勿使用诸如ISTZoneId z = ZoneId.of( "America/Montreal" ); 之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

Date

对于Instant,请转换为java.time中的等效项DateAfrica/Casablanca类代表Instant中时间轴上的一个时刻,分辨率为UTC(小数部分最多九(9)位)。与Instant一样,Instant instant = myJavaUtilDate.toInstant(); 始终位于nanoseconds

要在遗留类和java.time类之间进行转换,请查看添加到旧类的新方法。

ZonedDateTime zdt = instant.atZone( z );

指定UTC以生成ZoneId对象。

DateTimeFormatter

使用DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu HH:mm:ss" , Locale.US ); String output = zdt.format( f ); 生成表示该值的字符串。不要将日期时间对象与其值的字符串表示形式混淆。

 apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        applicationId "com.example.testapp"
        minSdkVersion 14
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:25.0.0'
    compile 'com.android.support:design:25.0.0'
    compile 'com.android.support:support-annotations:25.0.0'
    compile 'com.android.support:support-v4:25.0.0'
}


Error:(497) Attribute "navigationMode" already defined with incompatible format.
Error:(497) Attribute "displayOptions" already defined with incompatible format.
Error:(506) Attribute "layout_scrollFlags" already defined with incompatible format.
Error:(511) Attribute "actionBarSize" already defined with incompatible format.
Error:(515) Attribute "collapsedTitleGravity" already defined with incompatible format.
Error:(515) Attribute "expandedTitleGravity" already defined with incompatible format.
Error:(516) Attribute "layout_collapseMode" already defined with incompatible format.
Error:(518) Attribute "buttonTintMode" already defined with incompatible format.
Error:(520) Attribute "layout_anchorGravity" already defined with incompatible format.
Error:(523) Attribute "fabSize" already defined with incompatible format.
Error:(526) Attribute "showDividers" already defined with incompatible format.
Error:(530) Attribute "showAsAction" already defined with incompatible format.
Error:(544) Attribute "tabMode" already defined with incompatible format.
Error:(544) Attribute "tabGravity" already defined with incompatible format.
Error:(549) Attribute "backgroundTintMode" already defined with incompatible format.

Error:(7, 5) Original attribute defined here.
Error:(12, 5) Original attribute defined here.
Error:(52, 5) Original attribute defined here.
Error:(82, 5) Original attribute defined here.
Error:(204, 5) Original attribute defined here.
Error:(216, 5) Original attribute defined here.
Error:(188, 5) Original attribute defined here.
Error:(230, 5) Original attribute defined here.
Error:(242, 5) Original attribute defined here.
Error:(270, 5) Original attribute defined here.
Error:(279, 5) Original attribute defined here.
Error:(286, 5) Original attribute defined here.
Error:(336, 5) Original attribute defined here.
Error:(340, 5) Original attribute defined here.
Error:(382, 5) Original attribute defined here.