2011-12-30 15 views
30

Używam Jade do renderowania widoków z Express.js. Zapisuję dokumenty w MongoDB i używam Mongoose, aby uzyskać dostęp do moich dokumentów. Zapisuję datę domyślną utworzoną po utworzeniu nowego dokumentu i zwracam tę datę do atrybutu utworzonego dla widoku, w którym należy sformatować. Format daty jest przechowywany w MongoDB jest:Jak sformatować datę pochodzącą z MongoDB?

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

Moje pytanie brzmi: Jak mogę sformatować tę datę w Jade (lub Mongoose lub node.js) wraca z MongoDB?

Odpowiedz

40

JavaScript posiada wbudowaną obsługę terminów. Po pierwsze, aby uzyskać ciąg do obiektu Date:

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

Teraz można korzystać z różnych metod w dniu, aby uzyskać potrzebne dane:

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 

Można zobaczyć więcej metod on the MDN reference site. Możesz użyć tych metod, aby zbudować dowolny ciąg znaków, który chcesz.

Aby uzyskać bardziej niezawodne analizowanie danych, formatowanie i manipulowanie datami, zdecydowanie powinieneś wypróbować: Moment.js, o czym wspomniał s3v3n w innej odpowiedzi.

+0

Człowiek, to sprawia, że ​​do czynienia z datami dużo pracy podczas wyświetlania ich :( – CpILL

+6

@CpILL: Sprawdź http://momentjs.com/ –

+3

Jak pokazano, ** date.getMonth() ** zwraca 11 w grudniu. Prawdopodobnie będziesz chciał użyć ** date.getMonth () + 1 ** jeśli je wyświetlasz –

5

W rzeczywistości, nie potrzebujesz innego atrybutu w schemacie Mongoose do przechowywania daty utworzenia, ponieważ _id ma te informacje. Zamiast tego można utworzyć virtual na schemacie Mongoose coś takiego:

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

Że wróci surowego datę Javascript jako atrybut .date dla każdego dokumentu.

Następnie można przyjąć, że jeden krok dalej i sformatować datę, jak chcesz się tym, że wirtualny:

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

+1 za wskazanie, że przechowywanie generationTime jest zbędne, -1 za proponowanie utworzenia wirtualnego dla daty. Jest to oczywiście kwestia wyświetlania wartości, więc widok powinien sobie z tym poradzić. – enyo

15

Chyba nie próbowałem w prosty sposób?

#{storeddate.toDateString()} 
+1

Lub, aby upuścić dzień tygodnia ... # {storeddate.toDateString(). Substr (4,12)} –

56

Miałem dokładnie te wymagania (expressjs, mangusta, jade) i tak to rozwiązałem dla siebie.

Najpierw zainstalowałem momentjs z npm install moment. Wtedy zdałem chwilę aby za pomocą tego:

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 }); 
    }) 
}); 

Następnie używając go tak w 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

Awesome! Najlepsza odpowiedź IMHO! –

+0

@ s3v3n Jesteś BOGIEM. To uratowało mój dzień. Był sfrustrowany przez 3-4 godziny. – theChinmay

2

Oto przykład, w jaki sposób można to zrobić (przy użyciu 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(); 

    %> 

Teraz można korzystać z tych zmiennych tak ...

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

Źródło: https://medium.com/@littlelostify/how-to-format-mongoose-crappy-date-10df67d7a2d6

0

bardzo łatwy sposób kroki-

  1. instalacja przez chwilę npm flagą --save

  2. stwierdzenie var chwili = wymagają ('momentem');

  3. zdefiniuj zmienną declare w res.render'filename.ejs ', {moment: moment});

  4. umieść ten plik ejs w swoim pliku widoku <% = moment (data.kolumn_nazwa_twoj_dacie) .format ("DD MMM YYYY"); %>

wyjście - 09 czerwca 2017

można zmieniła format to sprawdzić w momencie połączenia do innego formatu http://momentjs.com/

Powiązane problemy