سؤال

لا أستطيع أن أفهم لماذا يحدث ما يلي:

String date = "06-04-2007 07:05";
SimpleDateFormat fmt = new SimpleDateFormat("MM-dd-yyyy HH:mm");
Date myDate = fmt.parse(date); 

System.out.println(myDate);  //Mon Jun 04 07:05:00 EDT 2007
long timestamp = myDate.getTime();
System.out.println(timestamp); //1180955100000 -- where are the milliseconds?

// on the other hand...

myDate = new Date();
System.out.println(myDate);  //Tue Sep 16 13:02:44 EDT 2008
timestamp = myDate.getTime();
System.out.println(timestamp); //1221584564703 -- why, oh, why?
هل كانت مفيدة؟

المحلول

ما ميلي ثانية؟أنت تقدم معلومات دقيقة فقط في المثال الأول، بينما يلتقط المثال الثاني التاريخ الحالي من النظام بالمللي ثانية، ما الذي تبحث عنه؟

String date = "06-04-2007 07:05:00.999";
SimpleDateFormat fmt = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss.S");
Date myDate = fmt.parse(date);

System.out.println(myDate); 
long timestamp = myDate.getTime();
System.out.println(timestamp);

نصائح أخرى

أتفق مع ما ورد أعلاه، لا ينبغي أن يكون هناك أي ميلي ثانية...

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

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

بدلاً من استخدام مكتبات Sun JDK Time/Date (التي تترك الكثير مما هو مرغوب فيه)، أوصي بإلقاء نظرة عليها http://joda-time.sourceforge.net.

يعد هذا مشروع sourceforge ناضجًا ونشطًا جدًا ويحتوي على واجهة برمجة تطبيقات أنيقة جدًا.

عندما تقوم بتحليل تاريخ فإنه يستخدم فقط المعلومات التي تقدمها.في هذه الحالة، يعرف فقط MM-dd-yyyy HH:mm.

يؤدي إنشاء كائن تاريخ جديد إلى إرجاع تاريخ/وقت النظام الحالي (عدد المللي ثانية منذ العصر).

toString() لكائن التاريخ لا يُظهر لك المللي ثانية ...لكنهم هناك

لذا فإن new Date() هو كائن ذو دقة ميلي ثانية، كما يمكن رؤيته من خلال:

  System.out.printf( "ms = %d\n", myDate.getTime() % 1000 ) ;

ومع ذلك، عند إنشاء التاريخ الخاص بك باستخدام SimpleDateFormat، لا يتم تمرير أي ميلي ثانية إليه

هل ينقصني السؤال هنا؟

[تحرير] هاهاها ... طريقة بطيئة جدا ؛)

تقوم Date.getTime بإرجاع عدد المللي ثانية منذ 1 يناير 1970، الساعة 00:00:00 بتوقيت جرينتش التي يمثلها كائن التاريخ.لذا فإن "06-04-2007 07:05" - "01-01-1970 00:00" يساوي 1180955340000 مللي ثانية.نظرًا لأن الاهتمام الوحيد لسؤالك يتعلق بالجزء الزمني من التاريخ، فإن الطريقة التقريبية للتفكير في هذا الحساب هي عدد المللي ثانية بين 07:05 و00:00 وهو 25500000.وهذا قابل للقسمة بالتساوي على 1000 نظرًا لأن أيًا من الزمنين لا يحتوي على أي ميلي ثانية.

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

ال getTime() طريقة Date إرجاع عدد المللي ثانية منذ 1 يناير 1970 (يسمى هذا التاريخ "الحقبة" لأن كافة تواريخ الكمبيوتر تستند إلى هذا التاريخ).أنه ينبغي لا يمكن استخدامها لعرض نسخة يمكن قراءتها بواسطة الإنسان من تاريخك.

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

String date = "06-04-2007 07:05:23:123";
SimpleDateFormat fmt = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss:S");
Date myDate = fmt.parse(date); 

System.out.println(myDate);  //Mon Jun 04 07:05:23 EDT 2007
String formattedDate = fmt.format(myDate);
System.out.println(formattedDate); //06-04-2007 07:05:23:123
import java.util.*;

public class Time {
    public static void main(String[] args) {
        Long l = 0L;
        Calendar c = Calendar.getInstance();
        //milli sec part of current time
        l = c.getTimeInMillis() % 1000;  
        //current time without millisec
        StringBuffer sb = new StringBuffer(c.getTime().toString());
        //millisec in string
        String s = ":" + l.toString();
        //insert at right place
        sb.insert(19, s);
        //ENJOY
        System.out.println(sb);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top