كيف يمكنني تحويل التاريخ والوقت microformat إلى الوقت المحلي في جافا سكريبت ؟

StackOverflow https://stackoverflow.com/questions/436374

سؤال

لدي صفحة التي تستخدم حاليا التاريخ والوقت microformat عرض الطابع الزمني, لكنني فقط تم عرض الإنسان للقراءة وقت المنطقة الزمنية الخاصة بى:

<abbr class="published" title="2009-01-09T09:16:00-05:00">
Friday, January 9, 2009 at 9:16 am (EST)</abbr>

ما أود القيام به هو كتابة innerHTML عن ابر الوسم أن يكون نفس الشكل ولكن فى هذا التوقيت المحلي.لذلك على القارئ في سياتل ، وينبغي أن يكون فوق تحويل إلى:

<abbr class="published" title="2009-01-09T09:16:00-05:00">
Friday, January 9, 2009 at 6:16 am (PST)</abbr>

لقد بحثت في جافا سكريبت تاريخ الكائن, الذي يسمح لي للحصول على التوقيت المحلي تعويض.ولكن لدي بعض المشاكل:

  1. أنا لا أرى طريقة سهلة لإنشاء موعد جديد كائن من ISO-8601 والطابع الزمني.(أعتقد أنني يمكن تحليل مع سلاسل فرعية أو regex إذا كان هناك أي طريقة أسرع.)

  2. أنا لا أرى وسيلة للحصول على اسمه اختصار التوقيت.على سبيل المثال, على القارئ في سياتل ، أرغب في أن الوقت "(PST)" إلحاق النهاية, وإلا فإنه ليس من الواضح أن هذا المستخدم أن الزمني وقد تم تحويل (خاصة إذا كان يقوم بزيارات متكررة وأصبحت اعتادوا على حقيقة أن بلدي مرات في EST).

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

المحلول

هنا هو رمز من الألغام التي يوزع ISO الزمني:

function isoDateStringToDate (datestr) {
  if (! this.re) {
    // The date in YYYY-MM-DD or YYYYMMDD format
    var datere = "(\\d{4})-?(\\d{2})-?(\\d{2})";
    // The time in HH:MM:SS[.uuuu] or HHMMSS[.uuuu] format
    var timere = "(\\d{2}):?(\\d{2}):?(\\d{2}(?:\\.\\d+)?)";
    // The timezone as Z or in +HH[:MM] or -HH[:MM] format
    var tzre = "(Z|(?:\\+|-)\\d{2}(?:\\:\\d{2})?)?";
    this.re = new RegExp("^" + datere + "[ T]" + timere + tzre + "$");
  }

  var matches = this.re.exec(datestr);
  if (! matches)
    return null;

  var year = matches[1];
  var month = matches[2] - 1;
  var day = matches[3];
  var hour = matches[4];
  var minute = matches[5];
  var second = Math.floor(matches[6]);
  var ms = matches[6] - second;
  var tz = matches[7];
  var ms = 0;
  var offset = 0;

  if (tz && tz != "Z") {
    var tzmatches = tz.match(/^(\+|-)(\d{2})(\:(\d{2}))$/);
    if (tzmatches) {
      offset = Number(tzmatches[2]) * 60 + Number(tzmatches[4]);
      if (tzmatches[1] == "-")
        offset = -offset;
    }
  }

  offset *= 60 * 1000;
  var dateval = Date.UTC(year, month, day, hour, minute, second, ms) - offset;

  return new Date(dateval);
}

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

نصائح أخرى

EcmaScript رسمية إضافة ISO-8601 نمط السلسلة بمثابة imput على جافا سكريبت التاريخ.منذ أكثر شبيبة التطبيقات لا تدعم هذا, أنا خلقت المجمع تاريخ الكائن الذي يحتوي على هذه الوظيفة.إذا قمت بتعيين عنوان العلامات إلى الإخراج في UTC/GMT/Z/الزولو تعويض ، يمكنك استخدام بلدي EcmaScript 5 ملحقات شبيبة تاريخ الكائن.

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

عن طريق مسج (مع ملحق):

$('.published').each(function(){
  var dtm = new Date(this.title);
  if (!isNaN(dtm)) {
    this.text(dtm.toString());
  }
});

لا أذكر إن كنت واضاف لدعم غير utc تاريخ مرات في المدخلات ، ولكن لن يكون من الصعب جدا حساب لهم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top