字符串转换日期与纳秒(String-Date conversion with nanoseconds

2019-06-17 18:26发布

我一直在挣扎着这片代码的Android应用程序一段时间,我无法得到它的窍门。 我已阅读并千方百计解决我的计算器和其他地方发现的,但仍没有运气。

我想要做的是有一个函数将字符串转换像"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"

如果任何人都可以给我提供一些解释/示例代码,我将非常感激。 提前致谢

Answer 1:

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

让我们来分析一下这个:

17.08.2012 05:35:19:7600000
  • 17:月日(17日)
  • 08:年月(8月)
  • 2012:年(2012年)
  • 05:每天一小时(上午05点)
  • 35:(:35)小时的时限
  • 19:(19)分钟的第二次
  • 7600000:第二毫秒(7600000)

现在,VM看到这个的方式是,你宣布一天的时间为上午05时35分19秒,然后加入760万毫秒到它。 7600000毫秒=7600秒= 2小时,6分钟,40秒。 上午5时35分19秒+ 2点06分40秒=上午07点41分59秒(0毫秒)。 这就是你所得到的结果。 (还可以看出你是不是设置时区正确,所以GMT字符串为您的结果背后3小时。)

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

我建议你创建一个新SimpleDateFormat为输出; 但请记住,毫秒会被吸收到其他时间(因为都是作为一个单一的存储longDate对象)。



Answer 2:

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

试试这个。



Answer 3:

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

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


文章来源: String-Date conversion with nanoseconds