Java/Android-将GMT时间字符串转换为本地时间
好的,我有一个字符串,比如“Tue May 21 14:32:00 GMT 2012”,我想把这个字符串转换成本地时间,格式为2012年5月21日下午2:32。我尝试了SimpleDataFormat(“MM dd,yyyy hh:MM a”).parse(),但它抛出了一个异常。那我该怎么办 异常为“未报告的异常java.text.ParseException;必须捕获或声明要抛出” 行Java/Android-将GMT时间字符串转换为本地时间,java,android,datetime,simpledateformat,Java,Android,Datetime,Simpledateformat,好的,我有一个字符串,比如“Tue May 21 14:32:00 GMT 2012”,我想把这个字符串转换成本地时间,格式为2012年5月21日下午2:32。我尝试了SimpleDataFormat(“MM dd,yyyy hh:MM a”).parse(),但它抛出了一个异常。那我该怎么办 异常为“未报告的异常java.text.ParseException;必须捕获或声明要抛出” 行Date-Date=inputFormat.parse(inputText) 我在TextMate上运行的代
Date-Date=inputFormat.parse(inputText)代码>
我在TextMate上运行的代码:
public class test{
public static void main(String arg[]) {
String inputText = "Tue May 22 14:52:00 GMT 2012";
SimpleDateFormat inputFormat = new SimpleDateFormat(
"EEE MMM dd HH:mm:ss 'GMT' yyyy", Locale.US);
inputFormat.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
SimpleDateFormat out = new SimpleDateFormat("MMM dd, yyyy h:mm a");
Date date = inputFormat.parse(inputText);
String output = out.format(date);
System.out.println(output);
}
}
您为解析提供的格式字符串与您实际获得的文本格式不一致。您需要先解析,然后格式化。看起来您想要:
SimpleDateFormat inputFormat = new SimpleDateFormat(
"EEE MMM dd HH:mm:ss 'GMT' yyyy", Locale.US);
inputFormat.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
SimpleDateFormat outputFormat = new SimpleDateFormat("MMM dd, yyyy h:mm a");
// Adjust locale and zone appropriately
Date date = inputFormat.parse(inputText);
String outputText = outputFormat.format(date);
编辑:以下是一个简短但完整的程序形式的相同代码,以及您的示例输入:
import java.util.*;
import java.text.*;
public class Test {
public static void main(String[] args) throws ParseException {
String inputText = "Tue May 21 14:32:00 GMT 2012";
SimpleDateFormat inputFormat = new SimpleDateFormat
("EEE MMM dd HH:mm:ss 'GMT' yyyy", Locale.US);
inputFormat.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
SimpleDateFormat outputFormat =
new SimpleDateFormat("MMM dd, yyyy h:mm a");
// Adjust locale and zone appropriately
Date date = inputFormat.parse(inputText);
String outputText = outputFormat.format(date);
System.out.println(outputText);
}
}
你能编译并运行精确的代码吗?你用来解析的格式化程序必须定义为你期望的格式。下面是一个适用于您提供的值的示例,但是您可能需要根据某些边缘情况对输入的作用进行更改:
String date = "Tue May 21 14:32:00 GMT 2012";
DateFormat inputFormat = new SimpleDateFormat("EE MMM dd HH:mm:ss zz yyy");
Date d = inputFormat.parse(date);
DateFormat outputFormat = new SimpleDateFormat("MMM dd, yyy h:mm a zz");
System.out.println(outputFormat.format(d));
SimpleDataFormat.parse方法引发解析异常
你得到的例外是告诉你
异常为“未报告的异常java.text.ParseException;必须被捕获或声明为抛出。”
用try-catch将进行解析的行包装起来,您应该是金色的
Date d=null;
try{
d = inputFormat.parse(date);
catch(ParseException e){
// handle the error here....
}
R您使用的是麻烦的旧日期时间类,现在已被java.time类取代
输入数据错误
您的第一个示例字符串不正确,因为21号是星期一而不是星期二。第二个带22的示例字符串是正确的,并在下面的示例代码中使用
使用java.time
避免将这种格式用于日期时间值的文本表示。特别是,不要使用这种格式中的3-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不标准,甚至不是唯一的(!)。指定一个。在这种特殊情况下,java.time能够将其转换为GMT
as,但其他值可能会失败
String input = "Tue May 22 14:52:00 GMT 2012";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd HH:mm:ss z uuuu" ).withLocale ( Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse ( input , f );
System.out.println ( "zdt: " + zdt );
转储到控制台。toString
方法生成标准格式的字符串,并通过在括号中添加区域名称进行扩展。当您需要将日期时间值序列化为文本时,这些标准格式是一个更好的选择
System.out.println ( "zdt: " + zdt );
zdt:2012-05-22T14:52Z[GMT]
生成字符串
您可以生成一个字符串,以任意格式表示该值。通常最好使用and让java.time自动本地化
所需的格式对日期部分使用中等长度样式,但对时间部分使用短长度样式。幸运的是,DateTimeFormatter
允许您分别定位每个部分,如这里我们传递一对对象的地方所示
转储到控制台
System.out.println ( "zdt: " + zdt + " | output: " + output );
zdt:2012-05-22T14:52Z[GMT]|输出:2012年5月22日下午2:52
关于java.time
该框架内置于Java8及更高版本中。这些类取代了旧的麻烦的日期时间类,如java.util.date
,.Calendar
,&java.text.SimpleDateFormat
该项目现已启动,建议迁移到java.time
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释
大部分java.time功能都在中向后移植到java 6和7,并进一步适应于中(请参阅)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
,等等。我尝试过,但行日期日期=inputFormat.parse(inputText);仍然抛出我上面提到的异常:(@user1066956:请发布当时所涉及的确切字符串-因为我使用了您在问题中给我的字符串,这很好。“2012年5月21日星期二14:32:00 GMT”是我使用的确切字符串。我在TextMate中运行了以下代码,得到了上面提到的错误。@user1066956:我在答案中编辑了一个简短但完整的程序。你能在你的桌面上运行准确的代码吗?当它失败时,是在Android中运行还是在Java中运行?顺便说一句,如果我们不知道时区的话(例如,有时字符串与America/Los_Angeles一起出现),我们应该用什么来代替“GMT”?我们应该用zzzz吗?您的示例文本顶部是21,这是星期一而不是星期二。与示例代码不同。
System.out.println ( "zdt: " + zdt + " | output: " + output );