楽しい時間操作
前JDK 8に、Java言語が動作した時間のための2つのクラスを提供してくれ、彼らは以下のとおりです。java.util.Dateとjava.util.Calendarのが、JDK 8に順に欠陥が操作の昔のクラスのいくつかを解決するときLocalTime、LocalDateTimeをは、インスタントは、java.timeパッケージの下に配置されています、ある動作時間と日付のためにいくつかの新しいクラスを提供します。
多くの場合、私たちの日常の開発に見られる動作時間は、我々は時間間隔やその他のビジネスデータを計算する必要があるなどのように、たとえば、ビジネスデータは、作成時刻と更新時刻を記録しなければならない、と形式にこれらのテイク時間後にフロントページに表示され、 、その後、どのように時間の適切かつエレガントな使用に、時間の動作と不可分ですか?これは、我々が議論しようとしているトピックです。
科学の時間の基礎
グリニッジ標準時
グリニッジ(も翻訳GMT)英国は、世界のコンピューティング時間と地球の経度のための開始点であるロンドンのサウスJiaoyuanグリニッジ天文台、に家である、経度国際会議は、グリーンウェイに合格することで合意に採用され、1884年にワシントンで開催されましたガバナンス観測経度ゼロ度の経度(すなわち子午線)、地球上の開始点の経度として、グリニッジ「ワールドタイムゾーン」を開始点として。
そして、北京の関係GMT
グリニッジ標準時は、世界の時間として定義され、0:00区、北京東8つの地区があります。これは北京時間に相当するが、1日8:00で、1日0:00グリニッジ標準時です。
タイムスタンプ
それは今までのタイムスタンプ1970-01-01夜12時00分00秒グリニッジ標準時(GMT 1970-01-01八時00分00秒)までの秒数の合計を指します。
操作の前にJDK 8回
1取得時間
Date date = new Date();
System.out.println(date);
Calendar calendar = Calendar.getInstance();
Date time = calendar.getTime();
System.out.println(time);
2タイムスタンプを取得し、
long ts = new Date().getTime();
System.out.println(ts);
long ts2 = System.currentTimeMillis();
System.out.println(ts2);
long ts3 = Calendar.getInstance().getTimeInMillis();
System.out.println(ts3);
3時間のフォーマット
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sf.format(new Date())); // output:2019-08-16 21:46:22
設定パラメータの意味のSimpleDateFormatは、次の表の情報を参照してください。
**字符** **含义** **示例** y 年 yyyy-1996 M 月 MM-07 d 月中的天数 dd-02 D 年中的天数 121 E 星期几 星期四 H 小时数(0-23) HH-23 h 小时数(1-12) hh-11 m 分钟数 mm-02 s 秒数 ss-03 Z 时区 +0800
使用例:
- 週取得:新しいのSimpleDateFormat( "E")形式(新しいDate())。
- 現在のタイムゾーンを取得します。新しいのSimpleDateFormat(「Z」)フォーマット(新日*())。
注:のSimpleDateFormatの下でマルチスレッドではスレッドセーフではありませんので、あなたは、この問題に注意を払うへのSimpleDateFormatを使用しています。マルチスレッドでは、不適切に使用した場合、結果かどうかメモリリークやその他の問題を引き起こす可能性があります。
4時間の変換
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// String 转 Date
String str = "2019-10-10 10:10:10";
System.out.println(sf.parse(str));
//时间戳的字符串 转 Date
String tsString = "1556788591462";
// import java.sql
Timestamp ts = new Timestamp(Long.parseLong(tsString)); // 时间戳的字符串转 Date
System.out.println(sf.format(ts));
注:SimpleDateFormat.parse変換()メソッドを使用する場合、SimpleDateFormatのコンストラクタは、変換と一貫性のある書式文字列でなければなりません。
5現時点では、昨日時間を取得
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -1);
System.out.println(calendar.getTime());
JDK 8の動作時間
LocalDateTimeを、LOCALDATE、にLocalTime:JDK 8の動作時間は、次の3つのカテゴリを追加しました。
- LOCALDATEは日付のみが含まれ、時間は含まれていない、不変クラス、およびスレッドセーフ。
- LocalTimeは、一度、ない日、不変クラス、およびスレッドセーフが含まれています。
- LocalDateTimeは、両方の時間が含まれていると日付、不変クラス、およびスレッドセーフを含んでいます。
スレッドの安全性
3つの時間関連のクラスで新しいJDK 8が大幅に次のマルチスレッドコードの開発のリスクを減少させる、スレッドセーフであることを言及する価値があります。
1取得時間
// 获取日期
LocalDate localDate = LocalDate.now();
System.out.println(localDate); // output:2019-08-16
// 获取时间
LocalTime localTime = LocalTime.now();
System.out.println(localTime); // output:21:09:13.708
// 获取日期和时间
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime); // output:2019-08-16T21:09:13.708
2タイムスタンプを取得し、
long milli = Instant.now().toEpochMilli(); // 获取当前时间戳(精确到毫秒)
long second = Instant.now().getEpochSecond(); // 获取当前时间戳(精确到秒)
System.out.println(milli); // output:1565932435792
System.out.println(second); // output:1565932435
3時間形式
// 时间格式化①
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String timeFormat = dateTimeFormatter.format(LocalDateTime.now());
System.out.println(timeFormat); // output:2019-08-16 21:15:43
// 时间格式化②
String timeFormat2 = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(timeFormat2); // output:2019-08-16 21:17:48
4時間の変換
String timeStr = "2019-10-10 06:06:06";
LocalDateTime dateTime = LocalDateTime.parse(timeStr,DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(dateTime);
5現時点では、昨日時間を取得
LocalDateTime today = LocalDateTime.now();
LocalDateTime yesterday = today.plusDays(-1);
System.out.println(yesterday);
関連インタビューの質問
1.現在時刻を取得する方法はいくつかありますか?
A:現在の時刻を取得し、3つの一般的な方法があります。
- 新しいDate()
- Calendar.getInstance()。getTime()
- LocalDateTime.now()
2.どのようにして、昨日時点の瞬間に入手できますか?
A:以下は、現時点では昨日の時間を取得するには、2つの方法があります。
// 获取昨天此刻的时间(JDK 8 以前)
Calendar c = Calendar.getInstance();
c.add(Calendar.DATE,-1);
System.out.println(c.getTime());
// 获取昨天此刻的时间(JDK 8)
LocalDateTime todayTime = LocalDateTime.now();
System.out.println(todayTime.plusDays(-1));
3.どのように月の最後の日を取得しますか?
以下は、この月の最後の日を取得するには、2つの方法があります。
// 获取本月的最后一天(JDK 8 以前)
Calendar ca = Calendar.getInstance();
ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
System.out.println(ca.getTime());
// 获取本月的最后一天(JDK 8)
LocalDate today = LocalDate.now();
System.out.println(today.with(TemporalAdjusters.lastDayOfMonth()));
4.現在のタイムスタンプを取得する方法はいくつかありますか?
A:以下は、現在のタイムスタンプを取得するには、いくつかの方法があります。
- System.currentTimeMillis()
- 新しいDate()。getTime()
- Calendar.getInstance()。getTime()。getTime()
- Instant.now()。toEpochMilli()
- LocalDateTime.now()。toInstant(ZoneOffset.of( "+ 8"))。toEpochMilli()
このうち、第四及び第五の方法は、JDK 8が新たに追加されましたです。
時間を計算する方法5.優雅に2時間で区切られましたか?
次のようにJDK 8時間のクラスは、正常時で分離された2つの時間を計算するために使用することができます。
LocalDateTime dt1 = LocalDateTime.now();
LocalDateTime dt2 = dt1.plusSeconds(60);
Duration duration = Duration.between(dt1, dt2);
System.out.println(duration.getSeconds()); // output:60
6.どのように優雅で区切られた2つの日付の日付を計算するには?
次のように期間クラスのJDK 8は、日付離間エレガント二つの日付を計算するために使用されます。
LocalDate d1 = LocalDate.now();
LocalDate d2 = d1.plusDays(2);
Period period = Period.between(d1, d2);
System.out.println(period.getDays()); //output:2
7.のSimpleDateFormatはスレッドセーフですか?なぜ?
A:のSimpleDateFormatはスレッドセーフではありません。SimpleDateFormatのソースコードは、中間オブジェクトを経由して、変換するすべてのフォーマットと解析を、必要性を学ぶことができます表示するので、オブジェクトは中間カレンダーなので、非スレッドセーフな原因となります。想像して、我々は複数のスレッドが同じデータを後でカレンダーを操作している時間がてSimpleDateFormatはスレッド以外になりましたので、最後の事実は、後に、データのスレッドを返されたことを、スレッドへの最初のスレッドをカバーします。
8.どのようにのSimpleDateFormatのスレッドの安全性を確保するには?
A:SimpleDateFormatの保証スレッドセーフ次のように:
- フォーマット動作同期キーワードを使用してパッケージ同期の使用は、スレッド形式をブロックすることを確実にするために、時間がかかります。
- 手動ロック、フォーマットコードに必要な時間、書かれた係止部が、相対的に同期、符号化効率、わずかに良好な性能、コードのより高いリスクを低下(最終、手動操作でロックを解除するリスクを忘れてはいけません) ;
- 代替のSimpleDateFormatを使用してJDKてDateTimeFormatter 8。
時間の新しいクラスの9 JDK 8の利点は何ですか?
A:次のように具体的にJDK 8つの利点は、以下の利点を有します。
- スレッドの安全性
- (等現在のタイムスタンプの利便性へのアクセス、日付の利便性を増加または減少させる、など)、使いやすさ
- LocalDateTime.now()形式(DateTimeFormatter.ofPattern( "YYYY-MM-DD HH:MM:SS"))より現在時刻として、シンプルでエレガントなフォーマットコーディング.;
10.どのように2時間(日)の比較しますか?
A:以下の三つの方法を比較した時:
- 2つの変数を減算し、長い変数の二種類を与えるために、二つのタイムスタンプを取得し、それが正および負の結果の大きさによって決定されます。
- 日によって()、()、等号()メソッドなどを比較した後、サンプルコードdate1.before(日付2)の前に来ます。
- compareToメソッドの比較()、コード例:date1.compareTo(日付2)-1の戻り値が前後者より小さい時間までの時間を示し、0に等しいことは、後の時間を表す1より大きい時間前の2時間を示しています。
概要
運転時間にJDK 8 java.util.Dateとjava.util.Calendarのを使用する前に、彼らは最初に、2つの非常に明確な欠点を持っている、セキュリティで保護されていない糸;二、APIコールは便利ではありません。JDK 8のLocalDateTimeは、いくつかの時間ベース操作java.timeパッケージ、LOCALDATE、にLocalTime、時間(離間計算時間)、期間(離れ計算日)で添加してDateTimeFormatter、使用のマルチスレッドのスレッドの安全性と使いやすさを提供します私たちはより良い時間を操作できるようにします。
___
私は公共の数の関心を歓迎し、「返信キーワードのJavaを両手贈り物があるだろう、」!!!私はあなたに成功したインタビューをしたいです!!!