【问题标题】:MongoDB DateTime FormatMongoDB 日期时间格式
【发布时间】:2012-04-14 05:45:47
【问题描述】:

在mongodb adhoc查询中,在执行查询之前,如何将日期类型元素格式化为dd\mm\yyyy格式再执行查询?

【问题讨论】:

  • 嗯,你用的是什么编程语言?您是否以编程方式执行此操作?

标签: mongodb


【解决方案1】:

不久前我问了一个类似的问题...这可能就是您要找的东西:What is the syntax for Dates in MongoDB running on MongoLab?

【讨论】:

  • 我通读了你的答案..实际上正在使用 java 驱动程序,我使用语法 new Date() 插入当前日期。现在我必须获取给定范围内的记录。问题是mongodb 中的日期是 dd/MM/yyyy HH:mm:ss 格式现在我要获取记录的格式是 dd/MM/yyyy 所以我无法正确获取记录。提前谢谢
【解决方案2】:

如果您使用 Java,您可以使用 DateFormat 类的 parse 方法从字符串创建 Date 对象。

可以在此处找到有关 DateFormat 类的 Java 文档: http://docs.oracle.com/javase/1.4.2/docs/api/java/text/DateFormat.html

parse 方法的具体部分在这里: http://docs.oracle.com/javase/1.4.2/docs/api/java/text/DateFormat.html#parse%28java.lang.String%29

可以在此处找到有关 Date 对象的 Java 文档: http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Date.html 根据“构造函数摘要”部分,将字符串传递给构造函数的能力是“已弃用。从 JDK 版本 1.1 开始,由 DateFormat.parse(String s) 取代。”

在研究上述内容时,我还遇到了 Calendar 类,它可用于转换 Date 对象和一组整数。此应用程序可能没有必要,但我认为包含文档链接可能很有用: http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Calendar.html

可以通过 set 方法传入年、月、日、小时等的整数: http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Calendar.html#set%28int,%20int,%20int,%20int,%20int%29

作为示例,这里有一个简短的 Java 程序,它创建许多 Date 对象,将它们存储在 Mongo 集合中,然后执行类似于您所描述的查询。希望它会帮助你实现你的目标。注意:该程序会删除一个名为“dates”的集合,因此如果您的数据库中已有这样的集合,请务必更改集合名称!

public static void main(String[] args) throws UnknownHostException, MongoException {
    Mongo m = new Mongo( "localhost:27017" );
    DB db = m.getDB("test");

    DBCollection coll = db.getCollection("dates");
    coll.drop();

    DateFormat df = DateFormat.getInstance();
    String dateString = new String();
    Date myDate = new Date();
    // Save some test documents
    for(int i=1; i<11; i++){
        dateString = "04/" + String.valueOf(i) + "/12 11:00 AM, EST";
        BasicDBObject myObj = new BasicDBObject("_id", i);
        try {
            myDate = df.parse(dateString);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        myObj.put("date", myDate);
        System.out.println(myDate);
        coll.save(myObj);
    }

    // Build the query 
    Date startDate = new Date();
    Date endDate = new Date();
    try {
        startDate = df.parse("04/4/12 11:00 AM, EST");
        endDate = df.parse("04/6/12 11:00 AM, EST");
    } catch (ParseException e) {
        e.printStackTrace();
    }
    BasicDBObject dateQuery = new BasicDBObject();
    dateQuery.put("$gte", startDate);
    dateQuery.put("$lte", endDate);

    System.out.println("---------------");
    //Execute the query
    DBCursor myCursor  = coll.find(new BasicDBObject("date", dateQuery));

    //Print the results
    while(myCursor.hasNext()){
        System.out.println(myCursor.next().toString());
    }
}

【讨论】:

    【解决方案3】:

    我通过使用 java 中的 getTime() 方法将日期时间插入为整数来解决这个问题。 例如:

    Date dt=new Date();
    long integer_date=dt.getTime();
    

    我使用上面的代码行将日期插入为整数。这样很容易获取特定日期之间的记录。

    【讨论】:

      【解决方案4】:

      Date 类有一个before(date)after(date) 方法...易于使用:无需转换为秒/毫秒。

      public void execute(Tuple input) {
          try {
              date=(Date) input.getValueByField("date");
              boolean before = date.before(myDate); // compare the data retrieved with your date.
              if (before) {
                  ...
              } else {
                  ...
              }
          } catch (Exception e) {
              logger.error("Error...", e);
          }
      

      这种方法比公认的答案更容易..

      【讨论】:

        【解决方案5】:

        这是使用完整的格式将代码从简单的日期时间格式转换为日期格式,反向步骤也支持这种从 MongoDB 检索日期的方式。

          SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
          Date fDate = formatter.parse((String) metaData.getValue());
          newMeta.setValue(fDate);[![In this image you can see how is the save scenario process in mongoDB][1]][1]
        

        【讨论】:

          猜你喜欢
          • 2018-02-22
          • 2013-06-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-23
          • 1970-01-01
          相关资源
          最近更新 更多