猫鼬模型:
const patientSchema = new mongoose.Schema({
firstName: String,
middleName: String,
lastName: String,
addresses: [addressSubschema],
dateOfBirth: Date,
files: [{ type: mongoose.Schema.Types.ObjectId, ref: 'File' }],
policies: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Policy' }],
claims: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Claim' }],
authorizations: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Authorization' }],
statements: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Statement' }],
documents: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Document' }],
notes: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Note' }]
}, { timestamps: true })
我使用 React 前端和标准 Node.js/Express 后端。创建新患者后,出生日期将作为字符串存储在文档中,如下所示:
1990-05-05T00:00:00.000+00:00
当我查询此文件并尝试显示日期时,最初允许我准确地显示日期:
<p className="card-text">{props.data.dateOfBirth}</p>
React 通常不会让你直接在屏幕上打印对象,所以我立刻就知道这是一个字符串而不是日期对象
原始格式当然对用户不友好,所以我尝试通过
new Date()
运行字符串将字符串转换为日期,但是当我这样做时,这是我得到的响应:
我正在转换为我的时区,日期最终会显示错误。过去,我一直记得 Mongoose 返回了一个日期对象,我需要将其转换为字符串。
我的主要问题是:如何让 Mongoose 只给我日期对象?我不想担心这个特定日期的时间。我只需要日期。
Date#toString()
时,JavaScript 运行时将使用您操作系统的时区。
另外,MongoDB 将日期存储为
64-bit integers
,这意味着 Mongoose 默认不存储时区信息。
你是对的,JS Date 不是有效的 ReactNode,如果你尝试渲染它,应该会出错,但依靠副作用来排除故障可能会产生不可靠的结果,特别是当你可能无法控制所涉及的任何依赖项时(例如 React、浏览器、组件等)。为了验证您认为看到的行为,最好直接检查该值的类型
typeof props.data.dateOfBirth
现在回答你的问题:
JS 日期是对象,但它们表示日期时间值,并在内部将其存储为数值(自 Unix 纪元以来的毫秒数)和时区偏移量(除其他外)。
您
可以获取日期输入,去掉时间,并将日期存储为没有时间值的日期对象,但是,您得到的是时间值为午夜的日期时间,这可能会由于以下原因而无法正确呈现时区偏移。 如果您只需要日期值用于渲染目的,那么最好将日期存储为字符串,否则您
将需要手动管理时区偏移和日期解析(或使用库来为您完成) .