【问题标题】:Converting the date returned from mongo to this format 2015-10-25将从 mongo 返回的日期转换为这种格式 2015-10-25
【发布时间】:2015-03-04 10:16:15
【问题描述】:

我有一个从 mongo db 返回的 json 文件,如下所示:

[
{
    "_id": {
        "$date": "2014-10-19T04:00:00.000Z"
    },
    "value": 29
},
{
    "_id": {
        "$date": "2014-10-20T04:00:00.000Z"
    },
    "value": 20
},
{
    "_id": {
        "$date": "2014-10-21T04:00:00.000Z"
    },
    "value": 21
}
]

现在我想用以下格式读取java中的日期:2014/10/25

但是当我使用时:

System.out.println("DAte is : "+result.get("_id").toString() );

结果是:

DAte is : Sun Oct 19 01:00:00 ADT 2014

然后我想到的唯一一件事就是使用子字符串并将日期手动转换为 2014-10-25,但我相信会有更好的方法。有人知道吗?

更新:

这是答案:

converting date from one format to another does not work

非常感谢您的帮助

【问题讨论】:

标签: java mongodb-query mongodb-java


【解决方案1】:

为什么不使用DateTimeFormatter?然后你可以这样解析你的日期:

// The test string
String str = "Sun Oct 19 01:00:00 ADT 2014";

// Formatter for the input date
final DateTimeFormatter inputFormat = 
        DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy");

// The parsed date
final ZonedDateTime parsed = ZonedDateTime.parse(str, inputFormat);

// The output format(s). Specify the one you need
final DateTimeFormatter outputFormat1 = DateTimeFormatter.ofPattern("yyyy/MM/dd");
final DateTimeFormatter outputFormat2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");

// Print
System.out.println(outputFormat1.format(parsed)); // -> 2014/10/19
System.out.println(outputFormat2.format(parsed)); // -> 2014-10-19

这个article 提供了一些关于如何解析和格式化日期的好读物。 DateTimeFormatter 类可用于 Java 8,如果您使用的是旧版本的 Java,则可以使用 SimpleDateFormat 类代替(它使用类似的策略来处理日期,但不幸的是不是线程安全的)。

编辑:在 OP 输入后更新了格式化程序

【讨论】:

  • 当我使用这一行时 final LocalDateTime parsed = LocalDateTime.parse(result.get("_id").toString() , inputFormat);我收到以下错误:Text 'Sun Oct 19 01: 00:00 ADT 2014' 无法在索引 0 处解析
  • 似乎 json 以下列格式返回日期:Sun Oct 19 01:00:00 ADT 2014
  • 好的,那么您可以对 inputFormatter 使用以下模式:EEE MMM dd HH:mm:ss zzz yyyy。我的印象(根据您提供的文件)输入日期如下所示:2014-10-21T04:00:00.000Z.
  • 你确定可以使用这个 Sun Oct 19 01:00:00 ADT 2014,因为我得到了同样的错误!
  • 当日期包含时区时,为什么要使用LocalDateTimeZonedDateTime 不是更好的选择吗?
【解决方案2】:

我建议您执行以下操作。

SimpleDateFormat original = new SimpleDateFormat("yyyy-MM-ddThh:mm:sssZ");
SimpleDateFormat output= new SimpleDateFormat("yyyy/MM/dd");
String isoFormat = original.format(result.get("_id"));
Date d = original.parse(isoFormat);
String formattedTime = output.format(d);

System.out.println(formattedTime);

【讨论】:

  • 问题是从 json 返回的日期如下:Sun Oct 19 01:00:00 ADT 2014 正好在这一行我会卡住:Date d = original.parse(result.get ("_id"));
  • 我已经更新了我的答案,应该可以处理这种情况,你能测试一下吗?
  • 不工作我得到这个错误:线程“main”java.lang.IllegalArgumentException中的异常:非法模式字符'T'
  • @HamedMinaee:您可以改用 new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:sss")。
【解决方案3】:

您可以使用此方法来解析 mongo 日期格式。但是在这里我们忽略了时区。因此,如果时区无关紧要,请使用它。

private static String convertMongoDate(String val){
    SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
    SimpleDateFormat outputFormat= new SimpleDateFormat("yyyy/MM/dd");
    try {
        String finalStr = outputFormat.format(inputFormat.parse(val));
        System.out.println(finalStr);
        return finalStr;
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return "";
}

【讨论】:

  • 这对我来说非常有效,例如:2018-02-06T20:52:04.424Z"
猜你喜欢
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
相关资源
最近更新 更多