String-Date转换为纳秒

时间:2012-08-17 06:16:42

标签: java android simpledateformat datetime-format date-parsing

我一直在为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 timezone设为UTC,但没有运气 我注意到的另一件事:如果我做df.setLenient(false);
它给了我:java.text.ParseException: Unparseable date: "17.08.2012 05:35:19:7600000"

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

4 个答案:

答案 0 :(得分:20)

你得到的结果绝对正确。

让我们分析一下:

17.08.2012 05:35:19:7600000
  • 17:月份(17日)
  • 08:一年中的一个月(八月)
  • 2012:年(2012)
  • 05:一天中的小时(早上5点)
  • 35:分钟(:35)
  • 19:分秒(:19)
  • 7600000:毫秒秒(7,600,000)

现在,VM看到这种情况的方式是你将时间宣布为5:35:19 am,然后再添加7,600,000毫秒。 7,600,000毫秒= 7,600秒= 2小时6分40秒。凌晨5:35:19 + 02:06:40 = 7:41:59 am(和0毫秒)这是你得到的结果。 (您似乎没有正确设置时区,因此GMT字符串比您的结果落后3小时。)

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

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

答案 1 :(得分: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;
}

试试这个。

答案 2 :(得分:3)

这就是你所需要的(但它会丢失毫秒信息):

C:\Users\daniel.bak\Desktop\Tableau Client Data Extracts\Master Data Extracts>fo
r /F "tokens=*" %Z in ('type "C:\Users\daniel.bak\Desktop\Tableau Client Data Ex
tracts\Master Data Extracts\clients.txt"') do (for /F "delims=; tokens=1,2" %B i
n (%Z) do (
echo %B
 echo %C
) )

C:\Users\daniel.bak\Desktop\Tableau Client Data Extracts\Master Data Extracts>(f
or /F "delims=; tokens=1,2" %B in (2;Glaxo Smith Kline) do (
echo %B
 echo %C
) )
The system cannot find the file 2.

C:\Users\daniel.bak\Desktop\Tableau Client Data Extracts\Master Data Extracts>(f
or /F "delims=; tokens=1,2" %B in (3;Merck Canada Inc.) do (
echo
 echo %C
) )
The system cannot find the file 3.

C:\Users\daniel.bak\Desktop\Tableau Client Data Extracts\Master Data Extracts>pa
use
Press any key to continue . . .

如果您使用2;herpherp 3;derpderp ,则会在几毫秒内获得三个前导零。

如果您使用"dd.MM.yyyy HH:mm:ss.'000000'" ,则可以格式化日期,但不能解析任何日期。

尝试一下:

"dd.MM.yyyy HH:mm:ss.SSSSSS"

答案 3 :(得分:0)

要降低纳秒,请使用:

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.")