Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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 - Fatal编程技术网

Java:使用时区变量将字符串转换为中的日期

Java:使用时区变量将字符串转换为中的日期,java,Java,我编写了一个func来将日期字符串(Thu,2012年3月1日13:57:06-0600)转换为日期变量。 我依赖SimpleDataFormat进行转换。转换发生了,但结果日期是“Thu Sep 01 11:00:06 GMT-08:00 2016”,我无法理解。我尝试了不同的格式字符串选项。谢谢你的帮助。多谢各位 我尝试过的格式字符串选项有: 1) 年月日,年月日HH:MM:ss Z 2) EEE,dd-MMM-yyy-HH:MM:ss-ZZZZ private Date Convert_T

我编写了一个func来将日期字符串(Thu,2012年3月1日13:57:06-0600)转换为日期变量。 我依赖SimpleDataFormat进行转换。转换发生了,但结果日期是“Thu Sep 01 11:00:06 GMT-08:00 2016”,我无法理解。我尝试了不同的格式字符串选项。谢谢你的帮助。多谢各位

我尝试过的格式字符串选项有: 1) 年月日,年月日HH:MM:ss Z 2) EEE,dd-MMM-yyy-HH:MM:ss-ZZZZ

private Date Convert_To_Date() {

        Date dt = null;

        String str = "Thu, 1 Mar 2012 13:57:06 -0600";
        SimpleDateFormat formatter = new SimpleDateFormat("E, dd MMM yyyy HH:MM:ss Z");

        try {
            dt = formatter.parse(str);
        }
        catch ( ParseException pe) {
            System.out.println(pe.getMessage());
        }

        //String strDt = dt.toString(); 
        System.out.println(dt);

        return dt;
    }

我认为问题在于你用“M”代替了“M”几分钟。这对我来说很好:

import java.text.*;
import java.util.*;

public class Test {
    public static void main(String[] args) throws Exception {
        String text = "Thu, 1 Mar 2012 13:57:06 -0600";
        // Note the explicit locale. Let's not leave it as the system default :)
        DateFormat formatter = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss Z", 
                                                    Locale.US);

        Date dt = formatter.parse(text);
        System.out.println(dt);
    }
}

(正如sgmorrison所指出的,您也可以使用
d
而不是
dd
,这将是对您的格式更准确的描述-但是
dd
在这种情况下可以用于解析。)

日期格式字符串中有几个小错误:

在小时中匹配分钟的模式应该是“mm”,而不是“mm”(匹配一年中的月份)。有关详细信息,请参阅

此外,您当月匹配天数的模式应为“d”,而不是“dd”,因为“模式字母的数量是最小位数,较短的数字被零填充到此数量。对于解析,除非需要分隔两个相邻字段,否则将忽略模式字母的数量。”

tl;博士 2012-03-01T13:57:06-06:00

java.time 现代方法使用java.time类来取代麻烦的旧遗留日期时间类

RFC 1123/RFC 822 您的输入字符串恰好符合/。该类为该格式定义了一个常量

2012-03-01T13:57:06-06:00

那些RFC是旧的。按照标准,这种格式现在已经过时了。旧的格式很糟糕:假设为英语,可以容忍各种各样的内容,并且很难解析

大多数现代协议和标准都使用文本格式来交换日期时间值。本标准定义的格式是实用的,即使跨文化也不含糊,易于机器解析,并且易于人为调试/记录

在解析/生成字符串时,java.time类默认使用ISO 8601格式,如上面的示例所示


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

使用符合或更高版本的,您可以直接与数据库交换java.time对象。不需要字符串或java.sql.*类

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和

ZonedDateTime.parse( 
    "Thu, 1 Mar 2012 13:57:06 -0600" ,    // Input complies with RFC 1123 & RFC 822.
    DateTimeFormatter.RFC_1123_DATE_TIME  // Hard-coded to English locale.
).toString()
String input = "Thu, 1 Mar 2012 13:57:06 -0600" ;
DateTimeFormatter f = DateTimeFormatter.RFC_1123_DATE_TIME ;
ZonedDateTime zdt = ZonedDateTime.parse( input , f ) ;