Nodejs 如何把mongodb中Date日期值转换成本地日期值?

Nodejs 如何把mongodb中Date日期值转换成本地日期值?

大家好, 我现在用mongodb的date格式,用node.js取出json数据,再通过httpclient传到android端,但我在 android端通过jsonObject.getString(“datename”)得到的数据是:2014-01-15T07:14:57.340Z ,比实际值少了8小时,我知道是时区问题,请问一般怎么处理这个问题。 谢谢!

8 回复

当然可以。下面是关于如何在 Node.js 中将 MongoDB 中的 Date 类型日期值转换为本地日期值的解决方案。

解释

MongoDB 存储日期时通常使用 ISO 8601 格式,并且这些日期值默认表示的是 UTC(协调世界时)。当你从 MongoDB 查询数据并在 Node.js 中获取时,日期会以 UTC 时间显示。如果你需要将其转换为本地时间,你需要进行时区调整。

示例代码

const MongoClient = require('mongodb').MongoClient;

// 连接到 MongoDB 数据库
MongoClient.connect('mongodb://localhost:27017/yourDatabase', (err, client) => {
    if (err) {
        console.error('Failed to connect to MongoDB:', err);
        return;
    }

    const db = client.db();
    const collection = db.collection('yourCollection');

    // 查询文档
    collection.findOne({}, (err, doc) => {
        if (err) {
            console.error('Error fetching document:', err);
            return;
        }

        // 获取原始的 UTC 日期
        const utcDate = doc.yourDateField;
        console.log('UTC Date:', utcDate);

        // 将 UTC 日期转换为本地日期
        const localDate = new Date(utcDate.getTime() + (utcDate.getTimezoneOffset() * 60000));
        console.log('Local Date:', localDate.toISOString());

        // 如果你希望以特定格式输出本地日期,可以使用以下方法
        const formattedLocalDate = localDate.toLocaleString();
        console.log('Formatted Local Date:', formattedLocalDate);

        // 关闭连接
        client.close();
    });
});

代码说明

  1. 连接到 MongoDB:使用 MongoClient 连接到你的 MongoDB 数据库。
  2. 查询数据:查询一个文档并获取包含 Date 字段的文档。
  3. 获取 UTC 日期:从查询结果中获取 Date 类型的字段。
  4. 转换为本地日期
    • utcDate.getTime() 获取 UTC 日期的毫秒数。
    • utcDate.getTimezoneOffset() * 60000 计算当前时区与 UTC 时区之间的差异(分钟转换为毫秒)。
    • 使用 new Date(...) 创建一个新的本地日期对象。
  5. 输出日期:打印出原始 UTC 日期、转换后的本地日期以及格式化后的本地日期。

这样,你就可以将 MongoDB 中存储的 UTC 日期正确转换为本地日期了。


如果以下这个结果没错的话

Wed Jan 15 2014 15:14:57 GMT+0800 (China Standard Time)

那么推荐用moment

npm install moment

谢谢,我要研究一下。 真的挺奇怪的,如果直接从node中查询后用console.log()输出,是这样正确的结果: Wed Jan 15 2014 15:14:57 GMT+0800 (China Standard Time),好像console会自动转换时区的。 但当字符串返回到android,用jsonObject取出来就又是Isodate格式了。

如果用moment那就是要在node端转换了,这样恐怕有问题,因为我是直接把查询结果返回给客户端,如果要转换那就要用forEach一个个转换了。 我想可能要在android端接收的时候做转换,但不知一般都是怎么处理这个问题的。

如果android端的原生应用,搜一下关键字"iso 8601 format java"应该有的吧 如果是android端的webview应用,moment也是可以的吧

用了一个函数来处理下: <pre><code> public static String toDateStringFromIso(String sdate) { if (“null”.equals(sdate) || “NULL”.equals(sdate) || “”.equals(sdate) || sdate == null) { return “”; } Date d1 = null; try { d1 = dateFormaterIsodate.get().parse(sdate); sharecalendar.setTime(d1); sharecalendar.set(Calendar.HOUR_OF_DAY,sharecalendar.get(Calendar.HOUR_OF_DAY)+8); d1=sharecalendar.getTime(); } catch (Exception e) { e.printStackTrace(); return “”; } return dateFormater4.get().format(d1); } </code></pre>

我都用 moment 在前端做,無痛轉換本地時間 管他+8, +9都好

在Node.js中,从MongoDB获取的Date对象默认是以UTC时间存储的。当您通过HTTP客户端传递这些日期值到Android端时,由于不同的时区设置,可能会出现时间偏差。为了将UTC时间转换为本地时间,可以在Node.js端进行日期格式化处理。

以下是一个简单的示例,展示如何在Node.js中将MongoDB中的UTC时间转换为本地时间:

const MongoClient = require('mongodb').MongoClient;
const moment = require('moment-timezone');

async function getLocalDateFromMongo() {
    const uri = "your_mongodb_connection_string";
    const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });

    try {
        await client.connect();
        const database = client.db("your_database_name");
        const collection = database.collection("your_collection_name");

        // 假设我们有一个名为"events"的集合,其中包含一个名为"eventDate"的日期字段
        const result = await collection.findOne({});

        // 将MongoDB的日期字段转换为本地时间
        const utcDate = result.eventDate;
        const localDate = moment(utcDate).tz("Asia/Shanghai").format("YYYY-MM-DD HH:mm:ss");

        console.log(localDate);
    } catch (err) {
        console.error(err.stack);
    } finally {
        await client.close();
    }
}

getLocalDateFromMongo();

解释

  1. 安装依赖: 首先需要安装moment-timezone库,用于处理日期时区转换。

    npm install moment-timezone
    
  2. 连接数据库: 使用MongoClient连接到MongoDB数据库,并选择对应的集合。

  3. 查询数据: 查询MongoDB中的一条记录(本例假设查询结果中包含名为eventDate的日期字段)。

  4. 日期转换

    • 使用moment库获取UTC时间。
    • 使用.tz()方法指定目标时区(例如:“Asia/Shanghai”),将其转换为本地时间。
    • 使用.format()方法格式化日期输出。

这样,在将日期传递给Android客户端之前,您已经确保了日期值是正确的本地时间。

回到顶部