2

私は、2つの日付の差と、それぞれミリ秒、秒、分、時間、日、月、年を表す整数の getDiffDateMap 戻り値を計算する方法に従いました。Map

public static Map<Integer, String> getDiffDateMap(String dateA, String dateB) {

    Calendar cal = Calendar.getInstance();      
    Map<Integer,String> out = new LinkedHashMap<Integer, String>();
    long timeInMillA = 0;
    long timeInMillB = 0;

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

    Date convertedDateA;
    Date convertedDateB;



    try {
        convertedDateA = dateFormat.parse(dateA);           
        cal.setTime(convertedDateA);
        timeInMillA = cal.getTimeInMillis();


        convertedDateB = dateFormat.parse(dateB);           
        cal.setTime(convertedDateB);
        timeInMillB = cal.getTimeInMillis();

    } catch (ParseException e) {
        e.printStackTrace();
    } 

    long mili = timeInMillB - timeInMillA;
    long sec = mili/1000;
    long min = sec/60;
    long hour = min/60;
    long day = hour/24;
    long week = day/7;
    long month = day/31; // ????
    long year = month/12;

    out.put(7, mili + "");
    out.put(6, sec + "");
    out.put(5, min + "");
    out.put(4, hour + "");
    out.put(3, day + "");
    out.put(2, week + "");
    out.put(1, month + "");
    out.put(0, year + "");

    return out;
}

私の問題は、実際の日数から月を計算することです。

long month = day/31; // or 30

例えば:

Map<Integer,String> out = getDiffInMillsec("2012-9-01 20:9:01", "2012-10-01 20:10:01");

    System.out.println(Arrays.asList(out)); 

出力が表示されます。[{7=2592060000, 6=2592060, 5=43201, 4=720, 3=30, 2=4, 1=0, 0=0}] ここで、1は月数とその0です。差は30日のみであるためです。この問題を解決するには、どのフローを追加する必要がありますか?助言がありますか?

4

5 に答える 5

6

2つの日付の差を計算し、それぞれミリ秒、秒、分、時間、日、月、年を表す整数のマップを返すgetDiffDateMapメソッドに従いました。

車輪の再発明をしないでください:)

Joda Timeには、これ以上のことを行うためのコードがあります。例えば:

LocalDateTime start = ...;
LocalDateTime end = ...;
Period difference = new Period(start, end, PeriodType.yearMonthDayTime());
int months = difference.getMonths(); // etc

月数は開始日/終了日によって異なるため、ミリ秒数に変換したばかりの月数では取得できないことに注意してください。(たとえば、30日は1か月である場合とそうでない場合があります...)

よりも、Javaコード全体でJodaTimeを使用することを強くお勧めしますjava.util.*。これははるかに優れたAPIであり、独自の日付/時刻処理コードを作成する必要がほとんどないことを意味します。

于 2012-11-01T20:32:10.323 に答える
4

JodaTime#Monthsを使用することをお勧めします

これには、次のような機能があります。

    static Months   monthsBetween(ReadableInstant start, ReadableInstant end) 

指定された2つの日時の間の月全体の数を表す月を作成します。

    static Months   monthsBetween(ReadablePartial start, ReadablePartial end) 

指定された2つの部分的な日時の間の月全体の数を表す月を作成します。

于 2012-11-01T20:37:36.970 に答える
1

ジョン・スキートの助けを借りて、私たちが以前に話したことをすべて結論付けたいと思います。これが答えです。私が使用JodaTimeしたnew Period日付ごとの値は次のとおりです。

import org.joda.time.LocalDateTime;
import org.joda.time.Period;
import org.joda.time.PeriodType;

....
    public static Map<Integer, String> getDateTimeDiffMap(String dateA, String dateB) {

    Calendar cal = Calendar.getInstance();
    Map<Integer,String> out = new LinkedHashMap<Integer, String>();

    long timeInMillA = 0;
    long timeInMillB = 0;

    SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT); 

    Date convertedDateA;
    Date convertedDateB;

    try {
    convertedDateA = dateFormat.parse(dateA);           
    cal.setTime(convertedDateA);
    timeInMillA = cal.getTimeInMillis();


    convertedDateB = dateFormat.parse(dateB);           
    cal.setTime(convertedDateB);
    timeInMillB = cal.getTimeInMillis();

} catch (ParseException e) {
    e.printStackTrace();
} 


    LocalDateTime startA = new LocalDateTime(timeInMillA);
    LocalDateTime startB = new LocalDateTime(timeInMillB);

    Period difference = new Period(startA, startB, PeriodType.days());
    int day = difference.getDays();

    difference = new Period(startA, startB, PeriodType.months());
    int month = difference.getMonths();

    difference = new Period(startA, startB, PeriodType.years());
    int year = difference.getYears();

    difference = new Period(startA, startB, PeriodType.weeks());
    int week = difference.getWeeks();

    difference = new Period(startA, startB, PeriodType.hours());
    int hour = difference.getHours();

    difference = new Period(startA, startB, PeriodType.minutes());
    long min = difference.getMinutes();

    difference = new Period(startA, startB, PeriodType.seconds());
    long sec = difference.getSeconds();

    //difference = new Period(startA, startB, PeriodType.millis());
    long mili = timeInMillB - timeInMillA;  


    out.put(7, mili + "");
    out.put(6, sec + "");
    out.put(5, min + "");
    out.put(4, hour + "");
    out.put(3, day + "");
    out.put(2, week + "");
    out.put(1, month + "");
    out.put(0, year + "");      

    return out;
}

たとえば、「01-09-2012 20:9:01」、「01-10-2012 20:9:01」の場合、次のように出力されます。

year=0;
month = 1;
day=30;
hour=720;
...
于 2012-11-03T18:34:45.743 に答える
1

java.time

java.utilDate-Time APIとそのフォーマットAPIはSimpleDateFormat古く、エラーが発生しやすいです。それらの使用を完全に停止し、最新の日時API *に切り替えることをお勧めします。

また、以下に引用されているのは、Joda-Timeのホームページからの通知です。

Java SE 8以降では、ユーザーはjava.time(JSR-310)に移行するように求められることに注意してください。これは、このプロジェクトに代わるJDKのコア部分です。

java.time最新の日時APIを使用したソリューション:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(getDiffDateMap("2012-9-01 20:9:01", "2012-10-01 20:10:01"));
    }

    public static Map<Integer, String> getDiffDateMap(String dateA, String dateB) {
        Map<Integer, String> out = new LinkedHashMap<Integer, String>();
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("u-M-d H:m:s", Locale.ENGLISH);
        LocalDateTime ldtA = LocalDateTime.parse(dateA, dtf);
        LocalDateTime ldtB = LocalDateTime.parse(dateB, dtf);

        out.put(7, String.valueOf(ChronoUnit.MILLIS.between(ldtA, ldtB)));
        out.put(6, String.valueOf(ChronoUnit.SECONDS.between(ldtA, ldtB)));
        out.put(5, String.valueOf(ChronoUnit.MINUTES.between(ldtA, ldtB)));
        out.put(4, String.valueOf(ChronoUnit.HOURS.between(ldtA, ldtB)));
        out.put(3, String.valueOf(ChronoUnit.DAYS.between(ldtA, ldtB)));
        out.put(2, String.valueOf(ChronoUnit.WEEKS.between(ldtA, ldtB)));
        out.put(1, String.valueOf(ChronoUnit.MONTHS.between(ldtA, ldtB)));
        out.put(0, String.valueOf(ChronoUnit.YEARS.between(ldtA, ldtB)));

        return out;
    }
}

出力:

{7=2592060000, 6=2592060, 5=43201, 4=720, 3=30, 2=4, 1=1, 0=0}

ONLINE DEMO

Trail: DateTimeから最新のDate-TimeAPIの詳細をご覧ください。


*何らかの理由で、Java6またはJava7に固執する必要がある場合は、 Java.time機能のほとんどをJava6および7にバックポートするThreeTen-Backportを使用できます。AndroidプロジェクトおよびAndroidAPIで作業している場合レベルはまだJava-8に準拠していません。脱糖によって利用可能なJava8+APIAndroidプロジェクトでのThreeTenABPの使用方法を確認してください。

于 2021-07-11T08:54:19.563 に答える
0
    try {
        String user = request.getParameter("uname");
        out.println(user); 
        String pass = request.getParameter("pass");
        out.println(pass);
        java.sql.Date sqlDate = new java.sql.Date(new java.util.Date().getTime());

        Class.forName( "com.mysql.jdbc.Driver" );
        Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/trans","root","root" ) ;
        Statement st = conn.createStatement(); 

        String sql = "insert into purch (cd,cust,dateof) values('" + user + "','" + pass + "', '" + sqlDate + "')";
        st.executeUpdate(sql);

        Date date = new Date();
        String modifiedDate= new SimpleDateFormat("-MM-").format(date);
        String dd = modifiedDate.toString();
        String da = "ai";
        out.println(dd);

        PreparedStatement statement = conn.prepareStatement("select * from purch where  dateof LIKE ? and cd = ?");    
        statement.setString(1,"%" + dd + "%");
        statement.setString(2,"" + da + "");
        ResultSet rs = statement.executeQuery();


        if(rs != null) {
        while(rs.next()) {
            out.println(rs.getString("cd"));
            out.println(rs.getString("cust"));
            out.println(rs.getString("dateof"));
        }
        }  
    }catch(Exception e) {
        System.out.println(e.toString());
    } 
于 2014-10-16T03:08:01.370 に答える