سؤال

لنفترض أن مستخدم موقع الويب الخاص بك يدخل نطاقا تاريخيا.

2009-1-1 to 2009-1-3

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

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

2009-1-1T8:00:00 to 2009-1-4T7:59:59

باستخدام كائن تاريخ JavaScript، كيف يمكنك تحويل نطاق التاريخ الأول "المتروي" في شيء سوف يفهم الخادم؟

هل كانت مفيدة؟

المحلول

ال toISOString() ترجع الطريقة سلسلة في تنسيق ISO الموسعة المبسطة (ISO 8601.)، وهو دائما 24 شخصا أو 27 حرفا (YYYY-MM-DDTHH:mm:ss.sssZ أو ±YYYYYY-MM-DDTHH:mm:ss.sssZ، على التوالى). The TimeZone هي دائما Zero UTC إزاحة، كما هو مرتبط باختناق "Z".

مصدر: MDN مستندات الويب

يتم إنشاء التنسيق الذي تحتاجه مع .toISOString() طريقة. بالنسبة للمتصفحات القديمة (IE8 وتحت)، والتي لا تدعم هذه الطريقة فقط، يمكن العثور على SHIM هنا:

هذا سوف يمنحك القدرة على القيام بما تحتاجه:

var isoDate = new Date('yourdatehere').toISOString();

لعمل الزمن، لحظة.js ولحظة هي بالفعل أدوات لا تقدر بثمن ... خاصة بالنسبة للتنقل مع مرور الوقت بين العميل والخادم جافا سكريبت.

نصائح أخرى

بسيط وغبي

var date = new Date(); 
var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),
 date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());

 return new Date(now_utc);

ها هي طريقتي:

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

النتيجة utc الكائن ليس حقا تاريخ UTC، لكن تاريخ محلي تحول لمطابقة وقت UTC (انظر التعليقات). ومع ذلك، في الممارسة العملية التي تقوم بها الوظيفة.

Date.prototype.toUTCArray= function(){
    var D= this;
    return [D.getUTCFullYear(), D.getUTCMonth(), D.getUTCDate(), D.getUTCHours(),
    D.getUTCMinutes(), D.getUTCSeconds()];
}

Date.prototype.toISO= function(){
    var tem, A= this.toUTCArray(), i= 0;
    A[1]+= 1;
    while(i++<7){
        tem= A[i];
        if(tem<10) A[i]= '0'+tem;
    }
    return A.splice(0, 3).join('-')+'T'+A.join(':');    
}

تحويل إلى ISO دون تغيير التاريخ / الوقت

var now = new Date(); // Fri Feb 20 2015 19:29:31 GMT+0530 (India Standard Time) 
var isoDate = new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString();
//OUTPUT : 2015-02-20T19:29:31.238Z

تحويل إلى ISO مع التغيير في التاريخ / الوقت (سيتم تغيير التاريخ / الوقت)

isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z 

رابط الكمان

قد تختلف المتصفحات، ويجب أن تتذكر أيضا عدم الثقة في أي معلومات تم إنشاؤها بواسطة العميل، والبيان أدناه يعمل بالنسبة لي (Google Chrome V24 على Mac OS X 10.8.2)

var utcDate = new Date(new Date().getTime());


تحرير: "كيف هذا يختلف فقط new Date()؟" انظر هنا: https:/developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/date.

  • إذا لم يتم توفير حجج، يقوم المنشئ بإنشاء كائن تاريخ JavaScript للتاريخ والوقت الحاليين وفقا لإعدادات النظام.
  • ملاحظة: حيث يتم استدعاء التاريخ كمنشئ بأكثر من حجة واحدة، تمثل الحجج المحددة التوقيت المحلي. إذا كانت UTC مطلوبة، استخدم تاريخ جديد (date.utc (...)) مع نفس الحجج. (ملاحظة: date.utc () إرجاع عدد millisecond منذ 1970-01-01 00:00:00 UTC)

إضافة 60000 * Date.gettimeZoneOffset () كما ذكرت الإجابات السابقة غير صحيحة. أولا، يجب أن تفكر في جميع التواريخ / الأوقات على أنها بالفعل UTC مع معدل TimeZone لأغراض العرض.

مرة أخرى، قد تختلف المتصفحات، ومع ذلك، date.gettime () إرجاع عدد المللي ثانية منذ 1970-01-01 UTC / GMT. إذا قمت بإنشاء تاريخ جديد باستخدام هذا الرقم كما أفعل أعلاه، فسيكون ذلك UTC / GMT. ومع ذلك، إذا قمت بعرضه عن طريق الاتصال. StoString ()، فستظهر في التلقائي المحلي الخاص بك لأن .tostring () يستخدم التلقائي المحلي المحلي الخاص بك، وليس timezone من كائن التاريخ الذي يطلق عليه.

لقد وجدت أيضا أنه إذا قمت بالاتصال. gettimezoneoffset () في تاريخ، سيعود timezone المحلي الخاص بك، وليس timezone لكائن التاريخ الذي قمت بسميته عليه (لا أستطيع التحقق من ذلك لتكون معيارا).

في متصفحي، إضافة 60000 * date.gettimeZoneOffset () يخلق DateTime ليس UTC.. وبعد ومع ذلك عند عرضه داخل المتصفح الخاص بي (Ex: .tostring ())، فإنه يعرض تاريخ بعد في الوقت المحلي المحلي الذي سيكون صحيحا وقت UTC إذا تم تجاهل معلومات TimeZone.

var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();

هل تحاول تحويل التاريخ إلى سلسلة من هذا القبيل؟

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

Date.prototype.getISOString = function() {
    var zone = '', temp = -this.getTimezoneOffset() / 60 * 100;
    if (temp >= 0) zone += "+";
    zone += (Math.abs(temp) < 100 ? "00" : (Math.abs(temp) < 1000 ? "0" : "")) + temp;

    // "2009-6-4T14:7:32+10:00"
    return this.getFullYear()   // 2009
         + "-"
         + (this.getMonth() + 1) // 6
         + "-"
         + this.getDate()       // 4
         + "T"
         + this.getHours()      // 14
         + ":"
         + this.getMinutes()    // 7
         + ":"
         + this.getSeconds()    // 32
         + zone.substr(0, 3)    // +10
         + ":"
         + String(temp).substr(-2) // 00
    ;
};

إذا كنت بحاجة إليه في وقت UTC، فما عليك سوى استبدال جميع وظائف Get * مع Getutc *، على سبيل المثال: Getutcylear، GetUTCMONTH، GENTICHOURS ... ثم أضف فقط "+00: 00" في النهاية بدلا من إزاحة Timezone للمستخدم.

date = '2012-07-28'; stringdate = new Date(date).toISOString();

يجب أن تعمل في معظم المتصفحات الأحدث. يعود 2012-07-28T00:00:00.000Z على فايرفوكس 6.0.

توصيتي عند العمل مع التواريخ هي تحليل التاريخ في الحقول الفردية من إدخال المستخدم. يمكنك استخدامه كسلسلة كاملة، لكنك تلعب بالنار.

يمكن لجافا سكريبت علاج تواريخ متساوية في تنسيقات مختلفة بشكل مختلف.

https:/developer.mozilla.org/en-us/docs/web/javascript/reeference/global_objects/date/parse.

لا تفعل أي شيء مثل:

new Date('date as text');

بمجرد حصولك على تاريخك في حقوله الفردية من إدخال المستخدم، قم بإنشاء كائن تاريخ. بمجرد إنشاء كائن التاريخ تحويله إلى UTC عن طريق إضافة إزاحة المنطقة الزمنية. لا أستطيع التأكيد على مدى أهمية استخدام الإزاحة من كائن التاريخ بسبب DST (هذا مناقشة أخرى ولكن لإظهار السبب).

var year = getFullYear('date as text');
var month = getMonth('date as text');
var dayOfMonth = getDate('date as text');

var date = new Date(year, month, dayOfMonth);

var offsetInMs = ((date.getTimezoneOffset() * 60)  // Seconds
                 * 1000);                          //  Milliseconds

var utcDate = new Date(date.getTime + offsetInMs);

الآن يمكنك تمرير التاريخ إلى الخادم في وقت UTC. مرة أخرى أود أن أوصى بشدة ضد استخدام أي سلاسل تاريخ. إما أن تمريرها إلى الخادم المقسمة إلى أدنى مستوى من الحبيبات التي تحتاجها على سبيل المثال، الشهر، واليوم، والدقيقة أو كقيمة مثل milliseconds من Enix Epoch.

إذا كنت تتعامل مع التواريخ كثيرا، فإن الأمر يستحق استخدام الوقت المناسب (http://momentjs.com.). ستكون الطريقة لتحويل إلى UTC:

moment(yourTime).utc()

يمكنك استخدام تنسيق لتغيير تاريخك إلى أي تنسيق تريده:

moment(yourTime).utc().format("YYYY-MM-DD")

هناك خيارات إزاحة في الوقت المناسب، ولكن هناك مكتبة تكميلية إضافية للتعامل مع timezone (http://momentjs.com/timezone/). سيكون التحويل الزمني بسيطا مثل هذا:

moment.tz(yourUTCTime, "America/New_York")

حلا آخر للتحويل إلى UTC واحتفظ به ككائن تاريخ: (يعمل عن طريق إزالة جزء "GMT" من نهاية السلسلة المنسقة، ثم أعدها إلى منشئ التاريخ)

var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));

كنت بحاجة للقيام بذلك إلى واجهة مع مكتبة منتقي DateTime. ولكن بشكل عام فهو فكرة سيئة للعمل مع التواريخ بهذه الطريقة.

يرغب المستخدمون في عموما العمل مع Datetimes في وقتهم المحلي، لذلك يمكنك إما تحديث التعليمات البرمجية جانب الخادم لتحليل سلاسل DateTime مع الإزاحة بشكل صحيح، ثم قم بتحويلها إلى UTC (أفضل خيار) أو تقوم بتحويلها إلى جانب عميل سلسلة UTC قبل إرسالها إلى خادم (مثل إجابة الإرادة ستيرن)

اكتشفت للتو أن إصدار 1.2.3 من ستيفن ليفثان date.format.js. لا فقط ما أريد. يسمح لك بتوفير سلسلة تنسيق لتاريخ JavaScript وسيتم تحويلها من التوقيت المحلي إلى UTC. إليك الرمز الذي أستخدمه الآن:

// JavaScript dates don't like hyphens!    
var rectifiedDateText = dateText.replace(/-/g, "/");
var d = new Date(rectifiedDateText);

// Using a predefined mask from date.format.js.
var convertedDate = dateFormat(d, 'isoUtcDateTime'); 

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

لن تحتاج أيضا إلى DeadePicker على الصفحة. يمكنك فقط استدعاء شيء مشابه للمثال الوارد في المستندات:

$.parseDate('yy-mm-dd', '2007-01-26');

هذه الوظيفة تعمل بشكل جميل بالنسبة لي.

function ParseDateForSave(dateValue) {
    // create a new date object
    var newDate = new Date(parseInt(dateValue.substr(6)));

    // return the UTC version of the date
    return newDate.toISOString();
}

استخدام Moment.js طريقة UTC;

const moment = require('moment');
const utc = moment.utc(new Date(string));

هذا ما فعلته في الماضي:

var utcDateString = new Date(new Date().toUTCString()).toISOString();

بالنظر إلى سؤالك من الواضح أنك تريد فقط إرسال نطاق التاريخ إلى الورقة الخلفية لمزيد من المعالجة.

أفترض أنك متوافق مع إرشادات البيانات القياسية التي تتوقع أن تكون البيانات بتنسيق معين. على سبيل المثال، أستخدم ODATA والتي تعد API Restfull التي تتوقع أن تكون كائنات وقت التاريخ للتنسيق: -

YYYY-MM-DDT00: 00: 00.

يمكن تحقيق ذلك بسهولة عبر المقتطف المنشور أدناه (يرجى تغيير التنسيق حسب الاحتياجات الخاصة بك).

var mydate;//assuming this is my date object which I want to expose var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";

إذا كان ذلك من ناحية أخرى، فأنت في وضعي حيث تلقيت تاريخا من الخلفية، وتحول المتصفح إلى تاريخك المحلي. من ناحية أخرى مهتمين بتاريخ UTC، يمكنك تنفيذ ما يلي: -

var mydate;//assuming this is my date object which I want to expose var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/ UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);

يضيف مقتطف التعليمات البرمجية أعلى أساسا / يطرح الوقت المضافة / طرحه بواسطة المتصفح بناء على TimeZone.

على سبيل المثال، إذا كنت في EST (GMT-5) وخدمتي إرجاع كائن وقت الوقت = Wed Aug 17 2016 00:00:00 بتوقيت GMT-0500 يطرح متصفحي تلقائيا تلقائيا إزاحة TimeZone (5 ساعات) للحصول على التوقيت المحلي الخاص بي. لذلك إذا حاولت جلب الوقت أحصل على الأربعاء Aug 16 2016 19:00:00 GMT-0500. هذا يسبب الكثير من المشاكل. هناك الكثير من المكتبات التي ستجعلها بالتأكيد أسهل ولكن أردت مشاركة نهج JS النقي.

لمزيد من المعلومات، يرجى إلقاء نظرة على: http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-utc-to-local-date/ أين حصلت على إلهامي.

أتمنى أن يساعدك هذا!

var userdate = new Date("2009-1-1T8:00:00Z");
var timezone = userdate.getTimezoneOffset();
var serverdate = new Date(userdate.setMinutes(userdate.getMinutes()+parseInt(timezone)));

هذا سوف يمنحك تاريخ ووقت UTC المناسب.
هذا بسبب getTimezoneOffset() سوف تعطيك الفرق الزمن في دقائق. أوصي بك عدم استخدام toISOString() لأن الإخراج سيكون في السلسلة وبالتالي في المستقبل لن تتمكن من التعامل مع التاريخ

هذه الطريقة سوف تعطيك: 2017-08-04T11:15:00.000+04:30 ويمكنك تجاهل منطقة متغير ببساطة الحصول عليها 2017-08-04T11:15:00.000.

function getLocalIsoDateTime(dtString) {
    if(dtString == "")
        return "";
    var offset = new Date().getTimezoneOffset();
    var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
    //Next two lines can be removed if zone isn't needed.
    var absO = Math.abs(offset);
    var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
    return localISOTime + zone;
}

إذا كنت بحاجة إلى كائن التاريخ

تمرير تاريخ تاريخ المرور فقط يفترض الوقت ليكون 00:00 تحولت حسب المنطقة الزمنية:

new Date('2019-03-11')
Sun Mar 10 2019 18:00:00 GMT-0600 (Central Standard Time)

إذا أضفت الساعات الحالية ودقائق تحصل على التاريخ المناسب:

new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)

باستخدام حزمة لحظات، يمكنك بسهولة تحويل سلسلة تاريخ من UTC إلى كائن تاريخ جديد:

const moment = require('moment');
let b = new Date(moment.utc('2014-02-20 00:00:00.000000'));
let utc = b.toUTCString();
b.getTime();

يساعد هذا خصيصا عندما لا يدعم الخادم الخاص بك TIMEZONE وتريد تخزين تاريخ UTC دائما في الخادم واحصل عليه ككائن تاريخ جديد. العمل أعلاه عملت لمتطلباتي مشكلة مماثلة أن هذا الموضوع هو. تقاسم هنا حتى يمكن أن يساعد الآخرين. لا أرى حلا أعلاه بالضبط في أي إجابة. شكرا.

أعرف أن هذا السؤال قديم، لكنه كان ينظر إلى هذه المشكلة نفسها، وسيكون خيار واحد لإرسال التاريخ .valueof () إلى الخادم بدلا من ذلك. ترسل وظيفة ValueOf () لتاريخ JavaScript عدد مللي ثانية منذ منتصف الليل 1 يناير، 1970 UTC.

قيمة ال()

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

//First i had a string called stringDateVar that i needed to convert to Date
var newDate = new Date(stringDateVar)

//output: 2019-01-07T04:00:00.000Z
//I needed it 2019-01-07T00:00:00.000Z because i had other logic that was dependent on that 

var correctDate = new Date(newDate.setUTCHours(0))

//This will output 2019-01-07T00:00:00.000Z on everything which allows scalability 

حتى أبسط

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top