解析另一个时区到日期对象中的格式化日期字符串不起作用



我正在尝试将格式化的日期字符串转换为日期对象。日期字符串的格式设置为其他时区。

当我这样做sdf.parse(String)时,它会返回我的系统日期对象。

代码如下,

static Date convertGMTTime(String timeZone, long longDate){
    Date convertedTime = null;
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try{
        Date date = new Date(longDate);
        System.out.println("timezone: "+timeZone +", timestamp: "+date);
        Locale locale = Locale.ENGLISH;
        TimeZone destTimeZone = TimeZone.getTimeZone(timeZone);// TimeZone.getDefault();
        System.out.println("Source timezone: "+destTimeZone);
/*          DateFormat formatter = DateFormat.getDateTimeInstance(
                    DateFormat.DEFAULT,
                    DateFormat.DEFAULT,
                    locale);
        formatter.setTimeZone(destTimeZone);*/
        sdf.setTimeZone(destTimeZone);
        String convertedDateStr = sdf.format(date);
        System.out.println("convertedDateStr: "+convertedDateStr);
        convertedTime = sdf.parse(convertedDateStr);
        System.out.println("convertedTime: "+convertedTime + "sdf: "+sdf.getTimeZone());
    }catch(Exception e){
        e.printStackTrace();
    }
    return convertedTime;
}

如果有人能提供帮助并指出我哪里出错,我将不胜感激。提前谢谢。

输出:

时区:大西洋/Cape_Verde,时间戳:IST 2012
年 6 月 26 日星期二 17:38:11 源时区: sun.util.calendar.ZoneInfo[id="Atlantic/Cape_Verde",offset=-3600000,dstSavings = 0,useDaylight=false,transitions=6,lastRule=null]

转换日期: 2012-06-26 11:08:11

转换时间:2012
年6月26日星期二17:38:11 IST sdf:sun.util.calendar.ZoneInfo[id="Atlantic/Cape_Verde",offset=-3600000,dstSavings = 0,useDaylight=false,transitions=6,lastRule=null]


分享更多细节,当我使用另一个 sdf 对象(没有为其设置时区)时,它确实会返回正确的时间和日期,但仍然从系统时钟中选择时区

法典

static Date convertGMTTime(String timeZone, long longDate){
    Date convertedTime = null;
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    SimpleDateFormat sdfParse = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try{
        Date date = new Date(longDate);
        TimeZone destTimeZone = TimeZone.getTimeZone(timeZone);// TimeZone.getDefault();
        System.out.println("Source timezone: "+destTimeZone);
        sdf.setTimeZone(destTimeZone);
        String convertedDateStr = sdf.format(date);
        System.out.println("convertedDateStr: "+convertedDateStr );
        convertedTime = sdfParse.parse(convertedDateStr,new ParsePosition(0));
        System.out.println("convertedTime: "+convertedTime + "sdf: "+sdf.getTimeZone());
    }catch(Exception e){
        e.printStackTrace();
    }
    return convertedTime;
}

输出

Source timezone: sun.util.calendar.ZoneInfo[id="Atlantic/Cape_Verde",offset=-3600000,dstSavings=0,useDaylight=false,transitions=6,lastRule=null]
convertedDateStr: 2012-06-26 12:24:56
convertedTime: Tue Jun 26 12:24:56 IST 2012 
sdf: sun.util.calendar.ZoneInfo[id="Atlantic/Cape_Verde",offset=-3600000,dstSavings=0,useDaylight=false,transitions=6,lastRule=null]

我知道当我不为 sdf 分配时区时,它会占用系统时区,但为什么它不以系统时区显示时间?我以时区显示它,就像在字符串中一样,但时区不同。

当我设置时区时,它会根据我的系统时间返回日期对象,而不管 sdf 是否设置了其他时区。

任何人都可以解释一下sdf.parse和sdf.format的功能行为。

对我来说,当我们使用格式时,sdf.setTimeZone()确实有其影响,当我们使用sdf.parse()时,它被取消了。我觉得很奇怪。

感谢这方面的帮助。

您已经有一个日期(或日期的毫秒数),因此没有要转换的内容。日期没有任何时区。这是一个普遍的时刻。仅当您显示此日期时,时区才相关,因为日期65647678000在某些时区可能是 12:38,但在其他时区可能是 10:38。当您解析日期的字符串表示形式时,它也很重要,因为 10:38 在某些时区65647678000,但在其他时区中65657678000。

虽然不显示 Date 对象,也不将字符串解析为日期,但无需关心时区。并且要选择显示/解析时使用的时区,请设置DateFormat的时区,然后使用DateFormat.format()/DateFormat.parse()来格式化/解析日期。

当您使用 Date.toString() 显示日期时,它将始终使用您当前的时区。

发现更容易理解我的意思,不要把日期看成是一天、一个月、一年、一个小时等,而是看作一个时刻:"肯尼迪被枪杀的时候"。"当肯尼迪被枪杀时"对每个人来说都是同一个时刻。但是,如果你用达拉斯时区表示"肯尼迪被枪杀"的时刻,这与你在巴黎时区代表同一时刻时得到的结果是不一样的。

相关内容

  • 没有找到相关文章

最新更新