جافاسكريبت - كيف يمكن تنسيق تاريخ UTC كسلسلة `YYYY-MM-DD hh:mm:ss` باستخدام NodeJS؟


باستخدام NodeJS، أريد تنسيق Date إلى صيغة السلسلة التالية:

var ts_hms = new Date(UTC);
ts_hms.format("%Y-%m-%d %H:%M:%S");

كيف أفعل ذلك؟

الإجابة رقم 1

إذا كنت تستخدم Node.js، فمن المؤكد أنك تملك EcmaScript 5، وبالتالي فإن Date يحتوي على طريقة toISOString. أنت تطلب تعديل طفيف في ISO8601:

new Date().toISOString()
> '2012-11-04T14:51:06.157Z'

لذا فقط قم بإزالة بعض الأشياء، وستكون جاهزًا:

new Date().toISOString().
  replace(/T/, ' ').      // replace T with a space
  replace(/\..+/, '')     // delete the dot and everything after
> '2012-11-04 14:55:45'

أو، في سطر واحد: new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '')

ISO8601 هو بالضرورة بتوقيت UTC (يشير إليه أيضًا الحرف Z في نهاية النتيجة الأولى)، لذا تحصل على توقيت UTC بشكل افتراضي (وهذا دائمًا أمر جيد).

الإجابة رقم 2

تحديث 2021-10-06: تم إضافة Day.js وإزالة التعديل غير الضروري بواسطة @ashleedawg
تحديث 2021-04-07: تم إضافة Luxon بواسطة @Tampa.
تحديث 2021-02-28: يجب الآن ملاحظة أن Moment.js لم يعد قيد التطوير النشط. لن يختفي بسرعة لأنه مدمج في العديد من الأشياء الأخرى. يحتوي الموقع على بعض التوصيات للبدائل وشرح للسبب.
تحديث 2017-03-29: تم إضافة date-fns، وبعض الملاحظات على Moment وDatejs
تحديث 2016-09-14: تم إضافة SugarJS الذي يبدو أن لديه بعض وظائف التاريخ/الوقت الممتازة.


حسنًا، بما أنه لم يقم أحد فعليًا بتقديم إجابة فعلية، إليكم إجابتي.

المكتبة بالتأكيد هي الخيار الأفضل للتعامل مع التواريخ والأوقات بطريقة معيارية. هناك الكثير من الحالات الحدية في حسابات التاريخ/الوقت، لذلك من المفيد أن تكون قادرًا على تفويض التطوير إلى مكتبة.

إليك قائمة بأهم مكتبات تنسيق الوقت المتوافقة مع Node:

  • Day.js [تمت الإضافة بتاريخ 2021-10-06] "بديل سريع بحجم 2 كيلو بايت لـ Moment.js مع نفس واجهة برمجة التطبيقات الحديثة"
  • لوكسون [تمت الإضافة في 2017-03-29، شكرًا لتامبا] "غلاف قوي، حديث وودود لتواريخ وأوقات جافا سكريبت." - تم إعادة بناء MomentJS من الصفر مع أنواع غير قابلة للتغيير، وسلسلة من الوظائف، وأكثر من ذلك.
  • Moment.js [بفضل مصطفى] "مكتبة جافاسكريبت خفيفة الوزن (4.3 كيلوبايت) لتحليل التواريخ والتلاعب بها وتنسيقها" - تشمل التدويل، والحسابات وصيغ التواريخ النسبية - تحديث 2017-03-29: لم تعد خفيفة الوزن تمامًا لكنها ما تزال الحل الأكثر شمولاً، خاصةً إذا كنت تحتاج دعم المناطق الزمنية. - تحديث 2021-02-28: لم تعد قيد التطوير النشط.
  • date-fns [أضيف في 2017-03-29، شكرًا لـ Fractalf] صغير، سريع، يعمل مع كائنات التاريخ القياسية في JS. بديل رائع لـ Moment إذا لم تكن بحاجة إلى دعم المنطقة الزمنية.
  • SugarJS - مكتبة مساعدة عامة تضيف ميزات مطلوبة جدًا لأنواع الكائنات المدمجة في جافاسكريبت. تشمل بعض القدرات الممتازة في التعامل مع التاريخ والوقت.
  • strftime - بالضبط كما تقول، بسيطة وسهلة
  • dateutil - هذا هو الذي كنت أستخدمه قبل MomentJS
  • تنسيق-تاريخ-العقدة
  • مسافر الزمن - "يوفر مسافر الزمن مجموعة من الطرق المساعدة للتعامل مع التواريخ. من الإضافة والطرح، إلى التنسيق. يقوم مسافر الزمن بتمديد كائنات التاريخ التي ينشئها فقط، دون تلويث الفضاء العالمي للأسماء."
  • تمبس [بفضل دان د] - التحديث: يمكن أيضًا استخدام هذا مع Node ونشره باستخدام npm، راجع المستندات

هناك أيضًا مكتبات غير Node:

  • Datejs [بفضل بيتر أولسون] - غير متوفر كمكتبة في npm أو GitHub لذلك ليس من السهل استخدامه مع Node - لا يُنصح به حقًا لأنه لم يتم تحديثه منذ عام 2007!

الإجابة رقم 3

هناك مكتبة للتحويل:

npm install dateformat

ثم اكتب متطلباتك:

var dateFormat = require('dateformat');

ثم اربط القيمة:

var day=dateFormat(new Date(), "yyyy-mm-dd h:MM:ss");

انظر تنسيق التاريخ

الإجابة رقم 4

ليس لدي أي اعتراض على المكتبات بشكل عام. في هذه الحالة، يبدو أن استخدام مكتبة للأغراض العامة مبالغ فيه، ما لم تكن أجزاء أخرى من التطبيق تعالج التواريخ بشكل كثيف.

كتابة وظائف مساعدة صغيرة مثل هذه تعتبر أيضًا تمرينًا مفيدًا لكل من المبرمجين المبتدئين والمحترفين على حد سواء، ويمكن أن تكون تجربة تعليمية للمبتدئين بيننا.

function dateFormat (date, fstr, utc) {
  utc = utc ? 'getUTC' : 'get';
  return fstr.replace (/%[YmdHMS]/g, function (m) {
    switch (m) {
    case '%Y': return date[utc + 'FullYear'] (); // no leading zeros required
    case '%m': m = 1 + date[utc + 'Month'] (); break;
    case '%d': m = date[utc + 'Date'] (); break;
    case '%H': m = date[utc + 'Hours'] (); break;
    case '%M': m = date[utc + 'Minutes'] (); break;
    case '%S': m = date[utc + 'Seconds'] (); break;
    default: return m.slice (1); // unknown code, remove %
    }
    // add leading zero if required
    return ('0' + m).slice (-2);
  });
}

/* dateFormat (new Date (), "%Y-%m-%d %H:%M:%S", true) returns 
   "2012-05-18 05:37:21"  */

الإجابة رقم 5

تحقق من الكود أدناه والرابط إلى كائن التاريخ، Intl.DateTimeFormat

// var ts_hms = new Date(UTC);
// ts_hms.format("%Y-%m-%d %H:%M:%S")

// exact format
console.log(new Date().toISOString().replace('T', ' ').substring(0, 19))

// other formats
console.log(new Date().toUTCString())
console.log(new Date().toLocaleString('en-US'))
console.log(new Date().toString())

// log format
const parts = new Date().toString().split(' ')
console.log([parts[1], parts[2], parts[4]].join(' '))

// intl
console.log(new Intl.DateTimeFormat('en-US', {dateStyle: 'long', timeStyle: 'long'}).format(new Date()))

الإجابة رقم 6

طريقة سهلة للقراءة وقابلة للتخصيص للحصول على طابع زمني بالتنسيق الذي تريده، دون استخدام أي مكتبة:

function timestamp(){
  function pad(n) {return n<10 ? "0"+n : n}
  d=new Date()
  dash="-"
  colon=":"
  return d.getFullYear()+dash+
  pad(d.getMonth()+1)+dash+
  pad(d.getDate())+" "+
  pad(d.getHours())+colon+
  pad(d.getMinutes())+colon+
  pad(d.getSeconds())
}

(إذا كنت بحاجة إلى الوقت بتنسيق UTC، فقط قم بتغيير استدعاءات الدالة. على سبيل المثال، تصبح "getMonth" هي "getUTCMonth")

الإجابة رقم 7

مكتبة الجافاسكربت sugar.js (http://sugarjs.com/) تحتوي على دوال لتنسيق التواريخ

مثال :

Date.create().format('{dd}/{MM}/{yyyy} {hh}:{mm}:{ss}.{fff}')