it-swarm.asia

ضبط الوقت إلى 00:00:00

أواجه مشكلة في إعادة تعيين ساعات في Java. لتاريخ محدد ، أريد ضبط الساعات على 00:00:00.

هذا هو الكود الخاص بي:

/**
     * Resets milliseconds, seconds, minutes and hours from the provided date
     *
     * @param date
     * @return
     */
    public static Date trim(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.HOUR, 0);

        return calendar.getTime();
    }

المشكلة هي أنه في بعض الأحيان يكون الوقت 12:00:00 وأحيانًا يكون 00:00:00 وعندما أقوم بالاستعلام عن قاعدة البيانات لكيان تم حفظه في 07.02.2013 00:00:00 ووقت الكيان الفعلي ، الذي تم تخزينه ، هو 12:00:00 فشل الاستعلام.

أعرف أن 12:00:00 == 00:00:00!

أنا أستخدم AppEngine. هل هذا خلل في appengine ، مشكلة أم مشكلة أخرى؟ أم أنها تعتمد على شيء آخر؟

103
Adelin

استخدم ثابتًا آخر بدلاً من Calendar.HOUR ، استخدم Calendar.HOUR_OF_DAY .

calendar.set(Calendar.HOUR_OF_DAY, 0);

يستخدم Calendar.HOUR 0-11 (للاستخدام مع AM/PM) ، ويستخدم Calendar.HOUR_OF_DAY 0-23.

على حد تعبير Javadocs:

ثابت النهائي النهائي العام ساعة

رقم الحقل للحصول على وتعيين تشير إلى ساعة من الصباح أو بعد الظهر. تستخدم ساعة لمدة 12 ساعة (0 - 11). يتم تمثيل الظهر والمنتصف ب 0 ، وليس ب 12. على سبيل المثال ، الساعة 10: 04: 15.250 PM الساعة H 10.

و

نهائي ثابت عام int HOUR_OF_DAY

رقم الحقل للحصول على وتعيين تشير إلى ساعة من اليوم. يستخدم HOUR_OF_DAY على مدار الساعة. على سبيل المثال ، الساعة 10: 04: 15.250 PM يوم HOUR_OF_DAY هو 22.

الاختبار ("الآن" حاليًا هو الساعة 14:55 يوم 23 يوليو 2013 بتوقيت المحيط الهادئ الصيفي):

public class Main
{
   static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void main(String[] args)
    {
        Calendar now = Calendar.getInstance();
        now.set(Calendar.HOUR, 0);
        now.set(Calendar.MINUTE, 0);
        now.set(Calendar.SECOND, 0);
        System.out.println(sdf.format(now.getTime()));
        now.set(Calendar.HOUR_OF_DAY, 0);
        System.out.println(sdf.format(now.getTime()));
    }
}

انتاج:

$ javac Main.Java
$ Java Main
2013-07-23 12:00:00
2013-07-23 00:00:00
173
rgettman

Java.time

باستخدام Java.time framework المضمّن في Java 8 والإصدارات الأحدث. انظر البرنامج التعليمي .

import Java.time.LocalTime;
import Java.time.LocalDateTime;

LocalDateTime now = LocalDateTime.now(); # 2015-11-19T19:42:19.224
# start of a day
now.with(LocalTime.MIN); # 2015-11-19T00:00
now.with(LocalTime.MIDNIGHT); # 2015-11-19T00:00

إذا كنت لا تحتاج إلى أجزاء من اليوم (ساعة ، دقيقة ، ثانية ، إلخ) ، فكر في استخدام LocalDate class.

LocalDate.now(); # 2015-11-19
18
Przemek

فيما يلي بعض وظائف الأداة المساعدة التي استخدمها للقيام بذلك فقط.

/**
 * sets all the time related fields to ZERO!
 *
 * @param date
 *
 * @return Date with hours, minutes, seconds and ms set to ZERO!
 */
public static Date zeroTime( final Date date )
{
    return DateTimeUtil.setTime( date, 0, 0, 0, 0 );
}

/**
 * Set the time of the given Date
 *
 * @param date
 * @param hourOfDay
 * @param minute
 * @param second
 * @param ms
 *
 * @return new instance of Java.util.Date with the time set
 */
public static Date setTime( final Date date, final int hourOfDay, final int minute, final int second, final int ms )
{
    final GregorianCalendar gc = new GregorianCalendar();
    gc.setTime( date );
    gc.set( Calendar.HOUR_OF_DAY, hourOfDay );
    gc.set( Calendar.MINUTE, minute );
    gc.set( Calendar.SECOND, second );
    gc.set( Calendar.MILLISECOND, ms );
    return gc.getTime();
}
11
user177800

من الأفضل تعيين المنطقة الزمنية بشكل أساسي إلى مكون DateFormat مثل هذا:

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));

ثم يمكنك الحصول على وقت "00:00:00" بتمرير 0 مللي ثانية لتنسيق:

String time = dateFormat.format(0);

أو يمكنك إنشاء كائن التاريخ:

Date date = new Date(0); // also pass milliseconds
String time = dateFormat.foramt(date);

أو يمكنك الحصول على المزيد من الاحتمالات باستخدام مكون التقويم ، لكن يجب عليك أيضًا تعيين المنطقة الزمنية بتوقيت جرينتش إلى مثيل التقويم:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US);
calendar.set(Calendar.HOUR_OF_DAY, 5);
calendar.set(Calendar.MINUTE, 37);
calendar.set(Calendar.SECOND, 27);

dateFormat.format(calendar.getTime());
3
Dmitriy Smerchinskiy

طريقة Java 8 أخرى:

LocalDateTime localDateTime = LocalDateTime.now().truncatedTo(ChronoUnit.HOURS);

لكن من المفيد للغاية تعديل التاريخ الموجود بالفعل.

2
thorinkor

يمكننا ضبط Java.util.Date جزء الوقت إلى 00:00:00 باستخدام فئة LocalDate من Java 8/Joda-datetime api :

Date datewithTime = new Date() ; // ex: Sat Apr 21 01:30:44 IST 2018
LocalDate localDate = LocalDate.fromDateFields(datewithTime);
Date datewithoutTime = localDate.toDate(); // Sat Apr 21 00:00:00 IST 2018
1
Atishay

القيام بذلك قد يكون أسهل (في Java 8)

LocalTime.ofNanoOfDay(0)
1
meszias

بما أن Java8 تضيف وظائف Date جديدة ، يمكننا القيام بذلك بسهولة.


    // If you have instant, then:
    Instant instant1 = Instant.now();
    Instant day1 = instant1.truncatedTo(ChronoUnit.DAYS);
    System.out.println(day1); //2019-01-14T00:00:00Z

    // If you have Date, then:
    Date date = new Date();
    Instant instant2 = date.toInstant();
    Instant day2 = instant2.truncatedTo(ChronoUnit.DAYS);
    System.out.println(day2); //2019-01-14T00:00:00Z

    // If you have LocalDateTime, then:
    LocalDateTime dateTime = LocalDateTime.now();
    LocalDateTime day3 = dateTime.truncatedTo(ChronoUnit.DAYS);
    System.out.println(day3); //2019-01-14T00:00
    String format = day3.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
    System.out.println(format);//2019-01-14T00:00:00


0
Chao Jiang

إذا كنت بحاجة إلى تنسيق 00:00:00 في السلسلة ، يجب عليك استخدام SimpleDateFormat على النحو التالي. باستخدام "H" بدلاً من "h".

Date today = new Date();
SimpleDateFormat ft = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); 
//not SimpleDateFormat("dd-MM-yyyy hh:mm:ss")
Calendar calendarDM = Calendar.getInstance();
calendarDM.setTime(today);
calendarDM.set(Calendar.HOUR, 0);
calendarDM.set(Calendar.MINUTE, 0);
calendarDM.set(Calendar.SECOND, 0);
System.out.println("Current Date: " + ft.format(calendarDM.getTime()));

//Result is: Current Date: 29-10-2018 00:00:00
0
Ngô Ngọc Quang

يمكنك إما القيام بذلك بما يلي:

Calendar cal = Calendar.getInstance();
cal.set(year, month, dayOfMonth, 0, 0, 0);
Date date = cal.getTime();
0
AppLogics Solutions Ltd.

هناك طريقة أخرى للقيام بذلك هي استخدام DateFormat دون أي ثوان:

public static Date trim(Date date) {
    DateFormat format = new SimpleDateFormat("dd.MM.yyyy");
    Date trimmed = null;
    try {
        trimmed = format.parse(format.format(date));
    } catch (ParseException e) {} // will never happen
    return trimmed;
}
0
MMKopp