سؤال

أريد إخراج طابع زمني مع إزاحة توقيت المحيط الهادئ (على سبيل المثال، 2008-11-13T13:23:30-08:00). java.util.SimpleDateFormat لا يبدو أنه يُخرج إزاحات المنطقة الزمنية في ملف ساعة: دقيقة الشكل، فإنه يستبعد القولون.هل هناك طريقة بسيطة للحصول على هذا الطابع الزمني في جافا؟

// I want 2008-11-13T12:23:30-08:00
String timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").format(new Date());
System.out.println(timestamp); 
// prints "2008-11-13T12:23:30-0800" See the difference?

أيضًا، SimpleDateFormat لا يمكن تحليل المثال أعلاه بشكل صحيح.يلقي أ ParseException.

// Throws a ParseException
new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").parse("2008-11-13T13:23:30-08:00")
هل كانت مفيدة؟

المحلول

والبدء في جافا 7، وهناك سلسلة نمط X عن المنطقة الزمنية ISO8601. سلاسل في الشكل الذي وصف، استخدم XXX. راجع وثائق .

وعينة:

System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX")
        .format(new Date()));

والنتيجة:

2014-03-31T14:11:29+02:00

نصائح أخرى

تفحص ال توقيت جودا طَرد.إنها تجعل تنسيق التاريخ RFC 3339 أسهل كثيرًا.

مثال جودا:

DateTime dt = new DateTime(2011,1,2,12,45,0,0, DateTimeZone.UTC);
DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
String outRfc = fmt.print(dt);

ومن "شعبة الحصول عليها القيام به،" حل واحد هو استخدام regexes لإصلاح السلسلة بعد اكتمال SimpleDateFormat. شيء من هذا القبيل ق / (\ د {2}) (\ د {2}) $ / $ 1: $ 2 / في بيرل.

إذا كنت مهتما حتى عن بعد في هذا، وسوف تعديل هذا الرد مع رمز جافا العمل.

ولكن، نعم. أنا ضرب هذه المشكلة أيضا. RFC3339، أنا ينظر إليك!

وتحرير:

وهذا يعمل بالنسبة لي

// As a private class member
private SimpleDateFormat rfc3339 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

String toRFC3339(Date d)
{
   return rfc3339.format(d).replaceAll("(\\d\\d)(\\d\\d)$", "$1:$2");
}

وقضيت الكثير من الوقت في البحث عن إجابة لنفس القضية وجدت شيئا هنا: <لأ href = "http://developer.android.com/reference/java/text/SimpleDateFormat.html" يختلط = "noreferrer"> http://developer.android.com/reference/java/text/SimpleDateFormat.html

والإجابة المقترحة:

وString timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZZZZZ").format(new Date());

إذا لاحظت أستخدمه 5 'Z' بدلا من واحدة. وهذا يعطي الناتج بنقطتين في الإزاحة من هذا القبيل: "2008-11-13T12: 23: 30-08: 00". نأمل أن يساعد.

والمشكلة هي أن Z تنتج في إزاحة المنطقة الزمنية دون بنقطتين (:) كفاصل.

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ss.SZ");

وأليس ما بالضبط ما تحتاجه؟

ولقد وجدت باستبين الضالة التي ساعدتني مع المشكلة: http://pastebin.com/y3TCAikc

وفقط في حالة محتوياته في وقت لاحق الحصول على حذف:

// I want 2008-11-13T12:23:30-08:00
String timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").format(new Date());
System.out.println(timestamp); 
// prints "2008-11-13T12:23:30-0800" See the difference?

// Throws a ParseException
new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").parse("2008-11-13T13:23:30-08:00")

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ss.SZ");

ولقد تقدمت InternetDateFormat فئة RFC3339.

ولكن شفرة المصدر التعليق هو الياباني.

وPS: أنا خلقت الطبعة الإنجليزية وإعادة بيع ديون قليلا

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