昨日Javaで2つの日付を指定して日数を計算させるコードを書いていたらちょっとおかしな現象に遭遇。
下記のコードで2010/1/29から2010/2/1までの日数を計算させると日数=0日になってしまう。
--------
import java.util.Calendar;
import java.util.GregorianCalendar;
public class Main {
public static void main(String[] args) {
useGregorianCalendar(2010, 1, 29, 2010, 2, 1);
}
static void useGregorianCalendar(int year_s, int month_s, int day_s,
int year_e, int month_e, int day_e)
{
Calendar start = new GregorianCalendar(year_s, month_s, day_s);
Calendar end = new GregorianCalendar(year_e, month_e, day_e);
System.out.println(start);
System.out.println(end);
long day = (end.getTimeInMillis() -
start.getTimeInMillis()) / 1000 / 60 / 60 / 24;
System.out.println("日数 = " + day + "日");
}
}
--------
実行結果
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2010,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=29,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2010,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=1,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
日数 = 0日
--------
そこで
++C++;// 未確認飛行 C 「経過日数の計算」
を参考にさせてもらって下記のように変更してみたところ日数=3という計算結果になった。
--------
import java.util.Calendar;
import java.util.GregorianCalendar;
public class Main {
public static void main(String[] args) {
System.out.println("日数 = " + (getDays(2010, 2, 1) - getDays(2010, 1, 29)) + "日");
}
//http://ufcpp.net/study/algorithm/o_days.html より
static int getDays(int y, int m, int d)
{
// 1・2月 → 前年の13・14月
if (m <= 2)
{
--y;
m += 12;
}
int dy = 365 * (y - 1); // 経過年数×365日
int c = y / 100;
int dl = (y >> 2) - c + (c >> 2); // うるう年分
int dm = (m * 979 - 1033) >> 5; // 1月1日から m 月1日までの日数
return dy + dl + dm + d - 1;
}
}
--------
実行結果
日数 = 3日
--------
計算結果がおかしいのはjava.util.GregorianCalendarでgetTimeInMillis()の結果が同じ値を返しているためらしい。
Calendar start = new GregorianCalendar(2010, 1, 29);
Calendar end = new GregorianCalendar(2010, 2, 1);
System.out.println("start.getTimeInMillis = " + start.getTimeInMillis());
System.out.println("end.getTimeInMillis = " + end.getTimeInMillis());
上記の計算結果が次のように同じ値を返している。
start.getTimeInMillis = 1267369200000
end.getTimeInMillis = 1267369200000
なんでかな?
2009年12月19日
2009年12月17日
OmmWriterが気になるのだが....
フルスクリーンテキストエディタOmmWriter の記事がすごく気になっていた。
<OmmWriter関連記事>
心理ハック 他のものを何も見ない
霊感の世界にいざなうエディタ、Ommwriter
書き物に没頭できるようなシンプルな見た目とBGMまで用意してくれたフルスクリーンテキストエディタ『OmmWriter』
Ommwriter
なんだかすごくカッコいい。
それに心理学的にも集中力が上がるらしい。
試してみたいが私のMacは10.4.11なので無理。
(Ommwriterは10.5以降に対応)
そうなると、どうしてもフルスクリーンテキストエディタを試してみたくなってJDarkRoomを試してみた。
(参考にしたサイト)
シンプルでフルスクリーン表示できるテキストエディタ『JDarkRoom』
WriteRoomも試したがこちらはシェアウェアで起動時に毎回登録の確認が出るみたい。
今後の使用頻度もまだわからないのでとりあえずJDarkRoomで行こうと決めた。
なかなか良いのだけど残念な点はショートカットキーが少ない。
私はよくEmacsを使うのでできればEmacsのCtlr+a(行頭)、d(del)、e(行末)、h(BackSpase)などが使えるとうれしいのだけど、JDarkRoomにはショートカットキーが無くてファンクションキーによる操作のみ。
・・・・なんてことを書きながら、ふとMacジャーナル5のウインドウを見ると

全画面モードあったよ。orz
情けない・・・完全に忘れてました。
Macジャーナル5に全画面モードがあったことを。
そしてそれが当時Macジャーナル5購入を決定した要因の一つでありました。
こっちはCtlr+a、d、e、hなどのショートカットが使えて、それに加えてCommand+a(すべてを選択)、f(文字列検索)、g(次を選択)なども使える。しかもCommand+dで現在日時を挿入してくれる。
これはいいっすね!(何を今更)
必要なときに全画面にできるという機能が選択肢として用意されているのが特にいいです。
私はネットで調べながらテキストを打つこともあるので常に全画面だとわずかにストレスを感じるときがあります。
もちろんCommand+Tabでアプリを切り替えれば済む話ではありますが・・・・。
なんというか、「調べ物中心でちょこっとメモしたい」という場合と、「がっつり書き物する」というときとで利用するツールを使い分けるのもイマイチだなと思ったりするわけです。
てことで、しばらくはテキストの打ち込みはMacジャーナル5の全画面モードでやっていきます。
<OmmWriter関連記事>
心理ハック 他のものを何も見ない
霊感の世界にいざなうエディタ、Ommwriter
書き物に没頭できるようなシンプルな見た目とBGMまで用意してくれたフルスクリーンテキストエディタ『OmmWriter』
Ommwriter
なんだかすごくカッコいい。
それに心理学的にも集中力が上がるらしい。
試してみたいが私のMacは10.4.11なので無理。
(Ommwriterは10.5以降に対応)
そうなると、どうしてもフルスクリーンテキストエディタを試してみたくなってJDarkRoomを試してみた。
(参考にしたサイト)
シンプルでフルスクリーン表示できるテキストエディタ『JDarkRoom』
WriteRoomも試したがこちらはシェアウェアで起動時に毎回登録の確認が出るみたい。
今後の使用頻度もまだわからないのでとりあえずJDarkRoomで行こうと決めた。
なかなか良いのだけど残念な点はショートカットキーが少ない。
私はよくEmacsを使うのでできればEmacsのCtlr+a(行頭)、d(del)、e(行末)、h(BackSpase)などが使えるとうれしいのだけど、JDarkRoomにはショートカットキーが無くてファンクションキーによる操作のみ。
・・・・なんてことを書きながら、ふとMacジャーナル5のウインドウを見ると

全画面モードあったよ。orz
情けない・・・完全に忘れてました。
Macジャーナル5に全画面モードがあったことを。
そしてそれが当時Macジャーナル5購入を決定した要因の一つでありました。
こっちはCtlr+a、d、e、hなどのショートカットが使えて、それに加えてCommand+a(すべてを選択)、f(文字列検索)、g(次を選択)なども使える。しかもCommand+dで現在日時を挿入してくれる。
これはいいっすね!(何を今更)
必要なときに全画面にできるという機能が選択肢として用意されているのが特にいいです。
私はネットで調べながらテキストを打つこともあるので常に全画面だとわずかにストレスを感じるときがあります。
もちろんCommand+Tabでアプリを切り替えれば済む話ではありますが・・・・。
なんというか、「調べ物中心でちょこっとメモしたい」という場合と、「がっつり書き物する」というときとで利用するツールを使い分けるのもイマイチだなと思ったりするわけです。
てことで、しばらくはテキストの打ち込みはMacジャーナル5の全画面モードでやっていきます。
登録:
投稿 (Atom)

