2012-08-17 122 views
10

我一直在为Android应用程序的这段代码挣扎了一段时间,我无法获取它的诀窍。我已经阅读并尝试了我在stackoverflow和其他地方找到的每个解决方案,但仍然没有运气。以纳秒为单位的字符串日期转换

我想要做的是有一个函数来将字符串"17.08.2012 05:35:19:7600000"转换为UTC日期和一个函数,它需要UTC date并将其转换为像这样的字符串。

String value = "17.08.2012 05:35:19:7600000"; 
DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss:SSSSSSS"); 
try 
{ 
    Date today = df.parse(value); 
    System.out.println("Today = " + df.format(today) + " " + today.toGMTString()); 
} 
catch (ParseException e) 
{ 
    e.printStackTrace(); 
} 

这会导致:Today = 17.08.2012 07:41:59:0000000 17 Aug 2012 04:41:59 GMT这两个都是错误的。

我试图设置SDF's timezoneUTC,没有运气。
我注意到的另一件事:如果我做df.setLenient(false);
它给我:java.text.ParseException: Unparseable date: "17.08.2012 05:35:19:7600000"

如果有人能给我提供一些解释/示例代码,我将非常感激。在此先感谢

回答

16

你得到的结果是绝对正确的。

让我们来分析一下这个:

17.08.2012 05:35:19:7600000 
  • 17:一个月中的天(17日)
  • 08:年月(8月)
  • 2012:年(2012)
  • 05:一天中的小时(上午5点)
  • 35:小时(:35)
  • 19:秒的第二分钟(:19)
  • 760:第二(7600000)

毫秒现在,VM看到这个的方式是,你宣布一天的时间为上午5点35分19秒,然后加入760万毫秒到它。 7,600,000毫秒= 7,600秒= 2小时6分40秒。 5:35:19 am + 02:06:40 = 7:41:59 am(和0毫秒)。这是你得到的结果。 (它似乎也没有正确设置时区,所以GMT字符串比你的结果落后3小时。)

如果你想保留:7600000,据我所知这是不可能的。由于这可以简化为几秒钟,虚拟机将自动将其减少到其他时间增量。毫秒(SSSS)应该用于存储值< 1000.

我建议您为您的输出创建一个新的SimpleDateFormat;但请记住毫秒将被吸收到其他时间(因为它们全部作为单个long存储在Date对象中)。

+0

谢谢! setTimeZone(TimeZone.getTimeZone(“UTC”))后,一切都OK了。大约毫秒,我想我会把它们重置为0.不要以为这对我来说很重要。我给出的例子是服务器的响应,作为UTC现在的时间,我将不得不明白为什么它会返回那些毫秒。 – Rhadoozooz 2012-08-17 06:42:59

+0

很高兴你已经找到了问题!祝你好运! :) – Eric 2012-08-17 06:43:41

+2

@Eric BTW很好的解释,可观。 – 2012-08-17 06:55:05

6
private String convertDate(String cdate) 
{ 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss:SSSSSSS"); 
    SimpleDateFormat postFormater = new SimpleDateFormat("yyyy-MM-dd"); 
    Date convertedDate; 
    try 
    { 
     convertedDate = dateFormat.parse(cdate); 
     cdate = postFormater.format(convertedDate); 
    } 
    catch (ParseException e) 
    { 
     Toast.makeText(getApplicationContext(),e.toString(),Toast.LENGTH_SHORT).show(); 
    } 
    return cdate; 
} 

试试这个。

+0

在postFormater键入您的格式 – 2012-08-17 06:25:01

2

这是你需要(但会失去毫秒信息)内容:

"dd.MM.yyyy HH:mm:ss.'000000'" 

如果使用"dd.MM.yyyy HH:mm:ss.SSSSSS",然后会得到您毫秒三大零。

如果您使用"dd.MM.yyyy HH:mm:ss.SSS'000'",那么您可以格式化一个日期,但不能解析任何日期。

试试看:

public static void main(String[] args) throws ParseException { 
    printDate("dd.MM.yyyy HH:mm:ss.SSS");//02.05.2010 21:45:58.073 
    printDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//02.05.2010 21:45:58.000073 
    printDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//02.05.2010 21:45:58.073000 
    printDate("dd.MM.yyyy HH:mm:ss.'000000'");//02.05.2010 21:45:58.000000 

    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS");//good 
    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//good 
    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//bad 
    tryToParseDate("dd.MM.yyyy HH:mm:ss.'000000'");//good 
} 

private static void printDate(String formatString) { 
    Date now = new Date(); 
    SimpleDateFormat format = new SimpleDateFormat(formatString); 
    String formattedDate = format.format(now); 

    // print that date 
    System.out.println(formattedDate); 
} 

private static void tryToParseDate(String formatString) { 
    Date now = new Date(); 
    SimpleDateFormat format = new SimpleDateFormat(formatString); 
    String formattedDate = format.format(now); 

    // try to parse it again 
    try { 
     format.parse(formattedDate); 
     System.out.println("good"); 
    } catch (ParseException e) { 
     System.out.println("bad"); 
    } 
}