2011-12-30 64 views
30

Tôi đang sử dụng Jade để hiển thị số lượt xem của mình từ trong Express.js. Tôi đang lưu tài liệu trong MongoDB và sử dụng Mongoose để truy cập tài liệu của tôi. Tôi đang lưu một ngày mặc định được tạo khi một tài liệu mới được tạo và tôi sẽ trả về thuộc tính được tạo ngày đó cho chế độ xem, nơi cần được định dạng. Định dạng của ngày được lưu trữ trong MongoDB là:Làm cách nào để định dạng ngày đến từ MongoDB?

Thu Dec 29 2011 20:14:56 GMT-0600 (CST) 

Câu hỏi của tôi là: Làm thế nào để định dạng ngày này trong Jade (hoặc Mongoose hoặc Node.js) trở về từ MongoDB?

Trả lời

40

JavaScript có hỗ trợ được tích hợp sẵn cho các ngày. Trước tiên, để có được chuỗi thành một đối tượng Date:

date = new Date('Thu Dec 29 2011 20:14:56 GMT-0600 (CST)') 

Bây giờ bạn có thể sử dụng phương pháp khác nhau về ngày để có được dữ liệu bạn cần:

date.toDateString() // "Thu Dec 29 2011" 
date.toUTCString() // "Fri, 30 Dec 2011 02:14:56 GMT" 
date.getMonth()  // 11 
date.getDate()  // 29 
date.getFullYear() // 2011 

Bạn có thể xem chi tiết các phương pháp on the MDN reference site. Bạn có thể sử dụng các phương pháp này để xây dựng bất kỳ loại chuỗi nào bạn muốn.

Để phân tích, định dạng và thao tác ngày/giờ mạnh mẽ hơn, bạn chắc chắn nên xem Moment.js như được đề cập bởi s3v3n trong câu trả lời khác.

+0

Man, điều này làm cho đối phó với ngày rất nhiều công việc khi hiển thị chúng: ( – CpILL

+6

@CpILL: Kiểm tra http://momentjs.com/ –

+3

Như được hiển thị, ** date.getMonth() ** trả về 11 cho tháng 12. Bạn có thể muốn sử dụng ** date.getMonth () + 1 ** nếu bạn đang hiển thị nó –

5

Thực ra, bạn không cần thuộc tính khác trong lược đồ Mongoose của bạn để lưu trữ ngày tạo vì _id có thông tin đó. Thay vào đó, bạn có thể tạo một virtual trên schema Mongoose của bạn, như thế này:

YourSchema.virtual('date') 
    .get(function() { 
    return this._id.generationTime; 
    }); 

Điều đó sẽ trở lại ngày Javascript liệu như .date thuộc tính cho mỗi tài liệu.

Sau đó, bạn có thể đi mà thêm một bước nữa và định dạng ngày bạn theo cách bạn muốn ở chỗ ảo:

YourSchema.virtual('date') 
    .get(function() { 
    return this._id.generationTime.toDateString(); 
    }); 
+4

+1 để chỉ ra rằng việc lưu trữ generationTime là dư thừa, -1 cho việc đề xuất tạo ảo cho ngày tháng. Điều này rõ ràng là vấn đề hiển thị giá trị, do đó, chế độ xem nên xử lý điều này. – enyo

15

Tôi đoán bạn đã không cố gắng một cách dễ dàng?

#{storeddate.toDateString()} 
+1

Hoặc, để giảm ngày trong tuần ... # {saveddate.toDateString(). Substr (4,12)} –

56

Tôi đã chính xác yêu cầu này (expressjs, mongoose, jade) và đây là cách tôi tự giải quyết nó.

Trước hết, tôi đã cài đặt momentjs với npm install moment. Sau đó, tôi trôi qua chút thời gian để xem sử dụng này:

var moment = require('moment'); 

app.get('/', function(req, res){ 
    // find all jobs using mongoose model 
    Job.find().exec(function(err, items){ 
     // pass moment as a variable 
     res.render('status', { 'jobs': items, moment: moment }); 
    }) 
}); 

Sau đó, sử dụng nó như thế này trong Jade:

table 
    tr 
    td Subject 
    td Posted at 
    td Status 
    each job, i in jobs 
    tr 
     td #{job.subject} 
     td #{moment(job.postedAt).format("YYYY-MM-DD HH:mm")} 
     td #{job.status} 
+5

Tuyệt vời! Câu trả lời hay nhất IMHO! –

+0

@ s3v3n Bạn là Đức Chúa Trời. Điều này đã cứu ngày của tôi. Đã thất vọng trong 3-4 giờ. – theChinmay

0

giải pháp của tôi là:

Thêm momentjs để người dân địa phương ứng dụng rõ ràng của bạn như thế này:
app.locals.moment = require('moment');

Sau đó, bạn có thể sử dụng thời điểm trong bất kỳ bộ lọc ngọc bích nào les:
span='(Created at: ' + moment(obj.createTime).format("YYYY/MM/DD") + ')'

tham khảo: Making use of utility libraries in server-side Jade templates

2

Dưới đây là một ví dụ về cách có thể làm điều đó (Sử dụng EJS)

<% 

    var monthNames = [ 
    "January", "February", "March", 
    "April", "May", "June", "July", 
    "August", "September", "October", 
    "November", "December" 
    ]; 

    var d = post.date.getDate(); 
    var m = monthNames[post.date.getMonth()]; 
    var y = post.date.getFullYear(); 

    %> 

Bây giờ bạn có thể sử dụng các biến Like This ...

<small style="color: red"><%= post.date %></small> 

Nguồn: https://medium.com/@littlelostify/how-to-format-mongoose-crappy-date-10df67d7a2d6

0

rất dễ dàng phương pháp steps-

  1. cài đặt qua khoảnh khắc NPM --save

  2. khai báo var khoảnh khắc = require ('khoảnh khắc');

  3. xác định biến khai báo trong res.render'filename.ejs ', {moment: moment});

  4. đặt ej này trong tệp xem của bạn <% = thời điểm (data.column_name_of_your_date) .format ('DD MMM YYYY'); %>

ra là - 09 tháng sáu năm 2017

bạn có thể thay đổi định dạng check it out trong liên kết khoảnh khắc cho định dạng khác nhau http://momentjs.com/

Các vấn đề liên quan