Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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 从字符串中检索年、月、日、小时、秒和时区,并转换为DateTime_Java_Regex_Date_Jodatime - Fatal编程技术网

Java 从字符串中检索年、月、日、小时、秒和时区,并转换为DateTime

Java 从字符串中检索年、月、日、小时、秒和时区,并转换为DateTime,java,regex,date,jodatime,Java,Regex,Date,Jodatime,我想使用以下格式的字符串获取DateTime对象:yyyyMMddHHmmss+时区 例如: 2013121601450+0000 看起来我可以使用DateTimeFormatter,但我真的不知道如何使用,然后我使用正则表达式来创建DateTime对象。为此,我使用以下方法: Pattern.compile("([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])\\+([0-9][0

我想使用以下格式的字符串获取DateTime对象:yyyyMMddHHmmss+时区

例如:

2013121601450+0000

看起来我可以使用DateTimeFormatter,但我真的不知道如何使用,然后我使用正则表达式来创建DateTime对象。为此,我使用以下方法:

Pattern.compile("([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])\\+([0-9][0-9][0-9][0-9])");
Matcher m = p.matcher(timestamp);
String match = m.group();
int year = Integer.parseInt(m.group(0));
int monthOfYear = Integer.parseInt(m.group(1));
int dayOfMonth = Integer.parseInt(m.group(2));
int hourOfDay = Integer.parseInt(m.group(3));
int minuteOfHour = Integer.parseInt(m.group(4));
int secondOfMinute = Integer.parseInt(m.group(5));
// TimeZone tz = TimeZone.getTimeZone("");
DateTime date = new DateTime(year, monthOfYear, dayOfMonth, hourOfDay, minuteOfHour, secondOfMinute);
这里我有两个问题,一个是我不知道如何设置时区

第二个问题是,运行这个程序我得到java.lang.IllegalStateException


有什么帮助吗?

这里不需要正则表达式。有一些java库已经解决了这个问题。看

这或许可以做到:

DateFormat df = new SimpleDateFormat("yyyyMMddHHmmssZ");
Date result =  df.parse(yourString);  
DateTime dateTime = new DateTime(result); //to get a joda DateTime object

编辑:JodaTime有一个类似的类

模式语法主要与java.text.simpleDataFormat兼容

请参阅和

使用2.3的一些示例代码

与java.util.Date不同,Joda时间知道自己的时区。如果愿意,可以在格式化程序定义中指定时区(调用
withZone
)。或者,您可以通过调用
toDateTime
并传递
DateTimeZone
实例,为区域创建一个新的DateTime实例集,如下所示

String String=“2013121601450+0000”;
DateTimeFormatter formatter=DateTimeFormat.forPattern(“yyyyMMddHHmmssZ”);
DateTime DateTime=formatter.parseDateTime(字符串);//默认时区。
//将时区转换为UTC/GMT。
DateTime dateTimeUtc=DateTime.toDateTime(DateTimeZone.UTC);
//将时区移到指定的时区。
//猜测“欧洲/马德里”适合于西班牙。
DateTime dateTimeMálaga=DateTime.toDateTime(DateTimeZone.forID(“欧洲/马德里”);
转储到控制台

System.out.println(“dateTime:+dateTime”);
System.out.println(“dateTimeUtc:+dateTimeUtc”);
System.out.println(“dateTimeMálaga:+dateTimeMálaga”);
当运行时

dateTime:2013-12-15T17:45:00.000-08:00
日期时间UTC:2013-12-16T01:45:00.000Z
dateTimeMálaga:2013-12-16T02:45:00.000+01:00

请使用
DateTimeFormatter
。网上有很多例子,javadoc甚至更好。^同意。此外,使用regex,您不需要重复那样的整数模式。
([0-9]{4})([0-9]{2})
等都可以正常工作。如果你有任何疑问,这是一个伟大的小网站!这句话很贴切:“有些人在遇到问题时会想:“我知道,我会使用正则表达式。”现在他们有两个问题。”——:)OP使用的是jodatime。是的,他使用。您可以轻松地将
java.util.Date
对象传递给
DateTime
构造函数,并获得一个joda
DateTime
对象。jodatime中也有类似的东西,我把它添加到了我的答案中。Thnaks,这就是我想要你做的。谢谢你的回答。我尝试过,但得到了java.lang.IllegalArgumentException:找不到类型为的即时转换器:。。。
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmssZ");
Date result =  df.parse(yourString);  
DateTime dateTime = new DateTime(result); //to get a joda DateTime object
 DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyyMMddHHmmssZ");
 DateTime dt = fmt.parseDateTime(yourString);