Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.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/Android-将GMT时间字符串转换为本地时间_Java_Android_Datetime_Simpledateformat - Fatal编程技术网

Java/Android-将GMT时间字符串转换为本地时间

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上运行的代

好的,我有一个字符串,比如“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上运行的代码:

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 );