JavaのAPIの日付時刻の包括的な分析

時間帯

  • GMT(グリニッジ標準時):日は、時間(グリニッジ超える最高点で、つまり)グリニッジ子午線を横切るときグリニッジ標準時は、GMT正午です。
  • UTC(協定世界時):GMT時間でできるだけ近い長い原子秒に基づいており、時間の調和、、、UTC時刻標準yyyy-MM-dd'T'HH:mm:ss.SSSXXX

GMTは、もはや標準時間として使用され、UTCは、世界の時間標準の中で最も重要なものはありません。

Javaは現在の時刻を取得するための方法を提供し、

  • 現在の瞬間に表され、ミリ秒単位で、現在の時刻を返すのSystem.currentTimeMillis()、1970-01-01 00:00:00.000ミリ秒差で。戻り値は、長いjava.util.Date、java.sql.Date、をjava.sql.Timestamp java.util.GregorianCalendarとオブジェクトを初期化するために使用することができます。
  • System.nanoTimeの()には、時間値(システムタイマの現在値)、最寄りのナノ秒を返します。JVMによって提供される時間は、主に正確に2つの期間の間の時間を測定するために使用されます

例えば、コードの一部は、以下を達成するためにどのくらいの時間を測定するために実行する必要があり、

long startTime = System.nanoTime();
//...the code being measured
long estimatedTime = System.nanoTime() - startTime;

時間粒度の
事実は、時間精度のSystem.currentTimeMillis()メソッドは、1ミリ秒以上です。あなたはこのメソッドを繰り返し実行する場合は、結果は短い時間同じになり、その後、突然、数十ミリ秒の増加で時間の結果に(以上であってもよい)ことがわかります。これは、結局、この方法は確かに世界で最も洗練されたタイマーの正常ではありません。

オールド・タイムAPI

昔のAPIの多くの問題がありますが、例えば、

  • Javaの定義された日付/時刻が同じクラスではない、とjava.utilのパッケージjava.sqlのクラスでフォーマットすると、クラス定義java.textパッケージを解析に加えて、日付を含んでいます。
  • java.util.Dateは、日付と時刻が含まれている、とだけjava.sql.Date日は無理のjava.sqlパッケージに組み込まれますが含まれています。さらに、これらの2つのクラスが、それ自体が非常に悪いデザインで同じ名前を持っています。
  • 時刻、タイムスタンプ、フォーマットと解析、およびいくつかのクラスのために明確に定義されていません。フォーマットと解析のための需要が、我々はjava.text.DateFormatの抽象クラスを持っていますが、通常は、SimpleDateFormatのクラスは、このようなニーズのために使用されています。
  • すべての日付は、変数クラスなので、最大の問題の一つは、Javaクラスとデートされ、スレッドセーフではありません。
  • Dateクラスも存在する国際的、時間がないゾーンのサポートを提供しますので、ジャワの導入とのjava.util.TimeZoneのjava.util.Calendarクラスが、彼らはすべての問題を超えているしません。

java.util.Dateクラス

java.util.Dateクラスは、一般的にのみ、彼は任意の演算処理、Calendarクラスは、治療、計算の便宜のために推奨されることはありません日付を表示され、日付と時刻の情報をカプセル化します。以下の廃止されたメソッドがリストされていない、あなたは、JDKドキュメント自体を表示することができます

コンストラクタ

  • 日付():割り当て日付オブジェクトとは、その割り当てられた時間(ミリ秒単位まで正確に)示すためにオブジェクトを初期化します。

  • 日付は(長い日付):(すなわち、1970年1月1日00:00:00 GMT、「エポック(エポック)」と呼ばれる)Dateオブジェクトを割り当て、オブジェクトを初期化し、標準ベースの時間以降に示すために、からのミリ秒数を指定します。 。

//1、使用Date类获取当前系统时间
Date date = new Date();
System.out.println(date);
//由于Date类覆盖了toString()方法,所以可以直接输出Date类型的对象
//输出结果为Fri May 31 10:51:18 GMT+08:00 2019

/*给Date设置年份需要减去 1900
*输出结果Tue Jul 01 00:00:00 GMT+08:00 3919
*原来这里存在一个起始年份 1900,实际年份是要在你的年份参数上加上个起始年份。
*/
Date date1 = new Date(2019,5,31);
System.out.println(date1);

//2.分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。
Date date2 = new Date(System.currentTimeMillis());//参数为19701月1日以来的毫秒数
Date date3 = new Date(1559284293556l); //long类型要加l
System.out.println(date2);
System.out.println(date3);
//其他Date方法摘要可查看api

カレンダーとのGregorianCalendarクラス

java.util.Calendarのクラスは、カレンダー情報をカプセル化し、時間成分の主な役割は、その操作方法であってもよいです。Calendarクラスは、特定の瞬間を提供する抽象クラスであり、そのようなカレンダフィールドYEAR、グループ、MONTH、DAY_OF_MONTH、HOURいくつかの他の方法、およびカレンダフィールドを操作するための(来週得る例えば、日付)との間の変換は、いくつかを提供しました方法。

Calendarクラスは抽象クラスで、Calendarクラスのコンストラクタが保護されているので、APIオブジェクトを作成するために使用されるgetInstanceメソッドを提供し、オブジェクトを作成するために、Calendarクラスのコンストラクタを使用することは不可能です。

Javaは実装クラスのこの種は、あなたが新しいまっすぐを使用することができる唯一のjava.util.GregorianCalendarのjava.util.Calendarを提供しています。

Calendar calendar = new GregorianCalendar();//新建出来的calendar默认时间为当前时间,或者说创建出这个对象的时间。

メソッドのインスタンスの静的メソッドで取得したカレンダーは、ラインからの面積は、私たちは地域が異なる地域に応じて、実際には、ここで注意すべき現在のシステムに応じてカレンダーインスタンスの作成を支援する際に決定される、いくつかのサブカテゴリーカレンダーは達成があります。カレンダー自体はインスタンス化できない抽象クラスです!ケアの具体例としては、我々は、我々は唯一の方法で処方カレンダーに従ってそれを使用する必要がある、のサブクラスを作成する必要はありません。

根本的な問題は、計算日を簡素化するためにも、Dateクラスの記述を使用する必要があり、特定の日付を示すために、クラスのカレンダーによって解決されます。カレンダー時間は日に説明することができ、我々は唯一のDateオブジェクトの日付の記述を取得するために使用することができ、そのgetTime()メソッドを呼び出す必要があります。

時間ベースのカレンダー計算することによって:カレンダー時間ベースの設定を、一般的な方法のセットを使用して、時間ベースのカレンダーを設定します。セット(int型フィールド、int値)、時刻コンポーネントのフィールドは、カレンダーの対応する値に対応する定数値、値を提供します。

0から始まるのみ月:0ヶ月〜1、というように、12月11日、他の回のように、最初から正常です。また、カレンダーようにcalendar.NOVEMBER定数......して使用することができます。

Calendar.DAY_OF_MONTH  月里边的天---号;
Calendar.DAY_OF_WEEK    星期里的天---星期几
Calendar.DAY_OF_YEAR     年里的天
Calendar calendar=Calendar.getInstance();//构造出来表示当前时间的日历类
Date now=calendar.getTime();//获取日历所描述的日期
calendar.set(Calendar.YEAR, 2019);//设置日历表示2019年 calendar.set(Calendar.DAY_OF_MONTH,15);//设置日历表示15号
calendar.add(Calendar.DAY_OF_YEAR, 22);//想得到22天以后是哪天
calendar.add(Calendar.DAY_OF_YEAR, -5);//5天以前是哪天
calendar.add(Calendar.MONTH, 1);得到1个月后是哪天
System.out.println(calendar.getTime());

getメソッドによって表される単位を使用することができます時間に現在のカレンダーの日付を取得します。

int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH)
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(year+"年"+(month+1)+"月"+day+"日");//month要处理

SimpleDateFormat类

一般的な工法

SimpleDateFormat(文字列パターン)、パターン - 日付および時刻フォーマットモードを説明します

指定されたパターンとデフォルトの日付書式ロケールシンボル構造のSimpleDateFormatと。注:このコンストラクタは、すべての言語環境をサポートしていないかもしれません。すべてのロケールをカバーするには、DateFormatクラスのファクトリメソッドを使用してください。

一般的な方法

public final String format(Date date)将一个 Date 格式化为日期/时间字符串
public Date parse(String source)throws ParseException从给定字符串的开始解析文本,以生成一个日期。

変換した文字列のDateオブジェクト

//创建一个SimpleDateFormat并且告知它要读取的字符串格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateFormat = "2019-05-31";//创建一个日期格式字符串
//将一个字符串转换为相应的Date对象
Date date = sdf.parse(dateFormat);//要先捕获异常
System.out.println(date);//输出这个Date对象

文字列にDateオブジェクト

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
Date date = new Date(); 
String dateStr = sdf.format(date);//把日期对象传进去,继承自DateFormat类的方法。将一个Date格式化为日期/时间字符串

日付形式で、 - 、スペースがない特別な意味。彼らは出力されているような特別な意味はありません

//将当前系统时间转换为2012/05/14 17:05:22的效果
SimpleDateFormat format1 = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
dateStr=format1.format(date);
System.out.println(dateStr);

DateFormatクラス

java.text.DateFormatのクラス(抽象)のSimpleDateFormatクラスは、可撓性のSimpleDateFormat、小さくないと、親クラスです。

java.sql.Date

java.sql.Date継承java.util.Dateは、前者を後者に置くためには、次のコードを必要とします

Date date = new Date();
//java.sql.Date 不支持Date参数的构造器,传入long类型的时间
java.sql.Date d = new java.sql.Date(date.getTime());
System.out.println(d);
System.out.println(d.getHours());

出力

2019-05-31
Exception in thread "main" java.lang.IllegalArgumentException
    at java.sql.Date.getHours(Unknown Source)
    at DateTest.DateTest1.main(DateTest1.java:40)

これは、分、秒、SQLのjava.sql.Date簡単な日付の種類によるものではありません。そのため、通常は挿入java.sql.Date JDBCデータにより、分、秒を見つけていません。日付と時刻の両方が必要な場合はそのため、タイムスタンプを使用する必要がありますこれは、タイムスタンプは、完全な情報のタイムスタンプが含まれ、また、java.util.Dateのサブクラスです。

java.sql.Timestampは(継承)java.util.Date派生クラスなので、java.util.Dateを行うことができます、をjava.sql.Timestampに行うことができます。
現在は、2019年6月1日14:35である場合、あなたは唯一のレコード2019年6月1日にこの情報java.sql.Dateを作成します。あなたはJDBCのための時間を維持する必要がある場合は、代わりをjava.sql.Timestampを使用します。

long time = System.currentTimeMillis();
java.sql.Timestamp timestamp = new java.sql.Timestamp(time);
timestamp.setNanos(123456);
int nanos = timestamp.getNanos(); // nanos = 123456

今、Dateクラスのメソッドのほとんどが放棄されている、それが今、一般的に、古いAPIを使用している、日付だけの時間を格納するための責任、およびカレンダーとはDateFormatは、オペレータ・インタフェースを提供します。カレンダーの日付は、特定の情報、操作の日付と時刻、日付と時刻の入力と出力のSimpleDateFormatの形式を取得します。

全体的に、日付、カレンダーとはDateFormatは日付と時刻の一般的な問題に対処することができました。しかし、必然的に、彼らは、まだ使用することは困難非常に面倒であり、これらの日付は、変数やクラススレッドセーフであります

ジョダタイム

詳細については、https://www.ibm.com/developerworks/cn/java/j-jodatime.htmlを参照してください

Javaの8日付と時刻のAPI

プロパティ

  • 不変性:新しい日付/時刻のAPIは、すべてのクラスは不変である、それはマルチスレッドのための非常に良いです。
  • 懸念の分離は:利点ジョダライブラリの一部から学び、新しいAPIは、人間が読み取り可能な日時やマシンタイム(Unixタイムスタンプ)日(日)で明確な分離、時間(タイム)、日付と時刻(日時)となります、タイムスタンプ(UNIXタイムスタンプ)とゾーニングは異なるクラスを定義します。
  • クリア:すべてのクラスにおいて、この方法は明らかに同じ動作を達成するために定義されています。例えば、現在のインスタンスを取得するために、我々は今、使用することができます()メソッドは、すべてのクラスが形式で定義されている中で()と()メソッドを解析するのではなく、以前のように別の特別なクラスを持っています。より良い問題に対処するためには、あなたはクラスのメソッドを使用したら、すべてのクラスでは、工場出荷時のパターンと戦略パターンを使用し、作業の他のタイプは難しいことではありません。
  • 実際の操作:加算、減算、書式設定、解像度、抽出された日付/時刻とは別の部分、など:すべての新しい日付/時刻のAPIクラスのような一般的なタスクを実行するための多数の方法を実装しています。
  • スケーラビリティ:新しい日付/時刻のAPIは、ISO-8601日历系统上的で動作しますが、我々はまた、非IOSのカレンダーに使用することができます。

Java8日期时间的默认格式如下:YYYY-MM-DD-HH-MM-ss.zzz

いくつかの主要なコアクラス:

  • LOCALDATE:Dateクラス、時間がないと
  • LocalTime:授業時間、日付なしで
  • LocalDateTime:日付と時刻のクラス
  • ZonedDateTime:タイムゾーンの日付時刻クラス
  • OffsetDateTime:UTC時間オフセット日時によって得られました
  • 時計:タイムゾーンの現在の瞬間の時間を取得し、日付や時刻
  • インスタント:Unixの時間、タイムスタンプの代わりに、など 2018-01-14T02:20:13.592Z
  • 所要時間:2時間スパンの間のミリ秒を使用して、絶対精度を表します
  • 期間:2つの日付の間
  • するzoneid:タイムゾーン
  • DateTimeFormatter:フォーマットされた出力
  • TemporalAdjusters:など月の最初の日、年の最後の日、として、指定された日付と時刻を取得します

これらの特定のクラスを使用する方法を見てみましょう

LOCALDATE、localtimeの、私のlocaldateti

日付を変更し、時刻オブジェクトが日付を表していないLOCALDATE、多くの場合、日付と見なさ。こうした年間、週と曜日の日などの他の日付フィールドも、アクセスすることができます。たとえば、値が「2007年10月2日には」LOCALDATEに格納することができます。

LocalTime日付と時刻オブジェクトを変更しないことが多い時間分秒と見られて時間を表します。ナノ秒精度の代表として時間。例えば、値「13:45.30.123456789は」にLocalTimeに格納することができます。

LocalDateTimeは、日付と時刻オブジェクトを変更しないことが多い年、月、日、時、分、秒と見られ、日付と時刻を表します。こうした年間、週と曜日の日などの他の日付と時刻のフィールドは、またアクセスすることができます。ナノ秒精度の代表として時間。例えば、「13時2007年10月2日:45.30.123456789」の値がLocalDateTimeをに保存することができます。

//now()在默认时区中从系统时钟获取当前日期。
LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS); //等价于 today.plusWeeks(1)

//of(int year, int month, int dayOfMonth) 获得 LocalDate实例从一年、月、日。 
LocalDate date = LocalDate.of(2019,5,31);
LocalTime time = LocalTime.of(20,31,20);

//of(LocalDate date, LocalTime time) 获得 LocalDateTime实例的日期和时间。 
LocalDateTime dateTime = LocalDateTime.of(date,time);
System.out.println(dateTime);

//LocalDate结合LocalTime成一个LocalDateTime
LocalDateTime dateTime2 = date.atTime(time);
System.out.println(dateTime2); //2019-05-31T20:31:20

DateTimeFormatter

出力日付形式は、静的ファクトリメソッドを作成する最も簡単な方法であるとしてDateTimeFormatter定数によって解析および書式の日付文字列フォーマッタ。フォーマットを作成し、一般的に次の三つの方法があります。

  1. 例えばISO_LOCAL_DATEような従来のISO形式の定数、
  2. ofPattern( "YYYY / MM / DD")としてアルファモード、
  3. このようofLocalizedDate(FormatStyle.MEDIUM)としてローカライズスタイル、

そして、すべててDateTimeFormatterインスタンスに比べて古いjava.util.DateFormatは、スレッドセーフです。

DateTimeFormatter完全な形式を使用します

//获取默认时区中从系统时钟获取当前日期时间。
LocalDateTime localDateTime = LocalDateTime.now();
//创建一个格式化程序使用指定的模式。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatDateTime = localDateTime.format(formatter);
System.out.println(formatDateTime);

//DateTimeFormatter提供了一些默认的格式化器,DateTimeFormatter.ISO_LOCAL_DATE_TIME 格式 yyyy-MM-ddTHH:mm:ss.SSS
String dateTime2 = localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
System.out.println(dateTime2);

文字列を使用すると、解析されていてDateTimeFormatter

//获得 LocalDate实例,从使用特定格式的文本字符串解析,文字使用格式化程序解析,返回一个日期。
LocalDate localDate = LocalDate.parse("2018/11/11",DateTimeFormatter.ofPattern("yyyy/MM/dd"));
System.out.println(localDate); //2018-11-11

インスタント

インスタントは少しタイムラインを表す(日付と同様に)、それは単に始めた1970年1月1日(UTC)の午前〇時00分00秒で、以降の秒数を表します。

インスタントは、2つの部分、時刻s秒の所定の時点まで、原点からの1つで構成され、2秒間隔のナノ秒数です。これは、Unixタイムスタンプの日付と人間の感覚(日付、等)の時間の処理ユニットを提供していない時間として記憶されます。

あなたはインスタントインスタントクラスファクトリメソッドでインスタンスを作成することができます

//调用instant.now()来创建一个确切的表达当前时间的Instant对象.另外也有一些其它方法能创建Instant,具体请查阅Java官方文档。
Instant now = Instant.now();
Instant later = now.plusSeconds(3);
Instant earlier = now.minusSeconds(3);

//第一个参数是秒,第二个是纳秒参数,纳秒的存储范围是0至999,999,999
//2s之后的在加上100万纳秒(1s)
Instant instant = Instant.ofEpochSecond(2,1000000000);
System.out.println(instant); //1970-01-01T00:00:03Z

Instant instant1 = Instant.now();
System.out.println(instant1); //2019-05-31T16:19:28.719Z

Instant instant2 = Instant.parse("2018-11-11T10:12:35.342Z");
System.out.println(instant2); //2018-11-11T10:12:35.342Z

//java.util.Date与Instant可相互转换
Instant timestamp = new Date().toInstant();
Date.from(Instant.now());

//为了更好的显示,代码改写为
Date date = new Date();
Instant timestamp = date.toInstant();
System.out.println(date);
System.out.println(timestamp);
Instant now1 = Instant.now();
Date date1 = Date.from(now1);
System.out.println(now1);
System.out.println(date1);
//输出结果
Sat Jun 01 00:29:42 GMT+08:00 2019
2019-05-31T16:29:42.566Z
2019-05-31T16:29:42.588Z
Sat Jun 01 00:29:42 GMT+08:00 2019

クロック

現在の時間を見つけるために使用されるクロックは、また古いのSystem.currentTimeMillis()メソッドとはTimeZone.getDefault()メソッドを置き換えるために使用することができるタイムゾーンの現在の日付と時刻を取得するために使用することができます。

//返回系统默认时间
Clock clock = Clock.systemDefaultZone();
System.out.println(clock.instant().toString());

//世界协调时UTC
Clock clock = Clock.systemUTC();  
//通过Clock获取当前时刻  
System.out.println("当前时刻为:" + clock.instant());  
//获取clock对应的毫秒数,与System.currentTimeMillis()输出相同  
System.out.println(clock.millis());  
System.out.println(System.currentTimeMillis());  

期間

期間は、オブジェクトの後に変更、その値を作成することができない場合には、不変のインスタンスです。あなただけの計算方法期間は、新しいDurtaionオブジェクトを作成することができます。あなたは、次のチュートリアルが表示されます。期間オブジェクトには、2個のインスタントの間の期間を表しています。

期間は、クラス期間Durationオブジェクトを作成するファクトリメソッドを使用して、インスタンスを作成しました

Instant first = Instant.now();
// wait some time while something happens
Instant second = Instant.now();
Duration duration = Duration.between(first, second);

//获得Duration表示秒数,然后获得在此期间的分钟数、小时数、天数
Duration d = Duration.ofSeconds(6000);  
System.out.println("6000秒相当于" + d.toMinutes() + "分");  
System.out.println("6000秒相当于" + d.toHours() + "小时");  
System.out.println("6000秒相当于" + d.toDays() + "天");  

継続時間アクセス
ナノ秒の値(1秒未満の部分)、秒(数秒の合計)、その期間の合成式:Durationオブジェクトには2つのフィールドを有しています。System.getCurrentTimeMillis(時間)異なる、継続時間(ミリ秒)を使用すると、この属性が含まれていないことに注意してください。
getSeconds()とgetNano():次の2つの方法でそれらの値を取得することができます

期間

期間日付()メソッドのみLOCALDATE型パラメータを受信することができるBETWEENので、二つの日付を計算するための時間を測定することです。

LocalDate start = LocalDate.of(2018, Month.JANUARY, 1);
LocalDate end = LocalDate.of(2020, Month.NOVEMBER, 11);
System.out.println("相隔月数:"+Period.between(start, end).getMonths());
System.out.println("相隔天数:"+Period.between(start, end).getDays());
//输出结果
相隔月数:10
相隔天数:10

なお、期間絶対差は(差の対応する日付直接数学的計算)が得られるが、真の間隔距離を示すものではありません

long distanceMonth = start.until(end, ChronoUnit.MONTHS);
long  distanceDay= start.until(end, ChronoUnit.DAYS);
System.out.println("相隔月数"+distanceMonth);
System.out.println("相隔天数"+distanceDay);
//输出结果
相隔月数:34
相隔天数:1045

ZonedDateTime和ZonedId

ZonedDateTimeクラスは、Java 8日付と時刻関数、テープを示す日付と時間帯情報の一種です。ZonedDateTime値クラスは不変であるため、計算方法は、新しいインスタンスZonedDateTimeを返します。

Javaは、異なるタイムゾーンを識別するためにするzoneidを使用して固定UTC参照の先頭からのオフセット。

ZonedDateTimeのインスタンスを作成します。

//使用当前时间作为值新建对象
ZonedDateTime dateTime = ZonedDateTime.now();

//使用指定的年月日、时分、纳秒以及时区ID来新建对象
//时区是用ZoneId类表示的,可以使用ZoneId.now()或ZoneId.of(“xxx”)来实例化:
//传给of()方法的参数是时区的ID,如“UTC+1”指距离UTC(格林威治时间)有一小时的时差
ZoneId zoneId = ZoneId.of("UTC+1");
ZonedDateTime dateTime2 = ZonedDateTime.of(2019, 6, 1, 14, 40, 48, 1234, zoneId);

//也可以使用另一种方式表示zone id,即使用地区名字
ZoneId zoneId2 = ZoneId.of("Europe/Copenhagen");

//GregorianCalendar与ZonedDateTime相互转换
ZonedDateTime zonedDateTime = new GregorianCalendar().toZonedDateTime();
GregorianCalendar.from(zonedDateTime);

TemporalAdjusters

時には、あなたは、次の日曜日、翌営業日、または月の最後の日までの日付の変更など、いくつかのより複雑な操作を、行う必要があります。

簡単なアプリケーションの例

LocalDate localDate = LocalDate.now();  
// 1. 本月第一天
LocalDate firstDayOfMonth = localDate.with(TemporalAdjusters.firstDayOfMonth());
// 2. 本月最后一天
LocalDate lastDayOfMonth = localDate.with(TemporalAdjusters.lastDayOfMonth());
// 3. 本年第一天
LocalDate firstDayOfYear = localDate.with(TemporalAdjusters.firstDayOfYear());
// 4. 下个月第一天
LocalDate firstDayOfNextMonth = localDate.with(TemporalAdjusters.firstDayOfNextMonth());
// 5. 本年度最后一天
LocalDate lastDayOfYear = localDate.with(TemporalAdjusters.lastDayOfYear());
System.out.println(firstDayOfMonth);
System.out.println(lastDayOfMonth);
System.out.println(firstDayOfYear);
System.out.println(firstDayOfNextMonth);
System.out.println(lastDayOfYear);

この時点では、使用することができます方法でオーバーロードされたバージョンを、それがTemporalAdjusterオブジェクトのよりカスタマイズされた選択、日付を扱うの柔軟性を提供渡し、。TemporalAdjustersクラスは、私たちの使用のための静的メソッドによって達成一般的に使用されるTemporalAdjusterの数を提供します。

/**
 * 时间校正器TemporalAdjuster
 */
@Test
public void Test() {
    LocalDateTime now1 = LocalDateTime.now();
    //获取月中的第一天
    now1.with(TemporalAdjusters.firstDayOfMonth());
    //获取下一年的第一天   
    now1.with(TemporalAdjusters.firstDayOfNextYear());
    //获取年中第一天
    now1.with(TemporalAdjusters.lastDayOfYear());
    //获取月中最后一天
    now1.with(TemporalAdjusters.lastDayOfMonth());
    //获取下个星期一
    now1.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
    //自定时时间:下一个工作日,因为这里需要一个接口,所以完全可以自定义方法
    now1.with((e) -> {
        LocalDateTime now = (LocalDateTime)e; 
        DayOfWeek dow = now.getDayOfWeek();
        if (dow.equals(DayOfWeek.FRIDAY)) 
            return now.plusDays(3);
        else if (dow.equals(DayOfWeek.SATURDAY))
            return now.plusDays(2);
        return  now.plusDays(1);
    });
}

変更

java.util.DateとLOCALDATE、にLocalTime、LocalDateTimeを変換

次のように実装され、手段ZonedDateTimeとインスタントで日付LOCALDATE、にLocalTime、LocalDateTimeをに変換されます。

Date date = new Date();
System.out.println("current date: " + date);

// Date -> LocalDateTime
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println("localDateTime by Instant: " + localDateTime);

// Date -> LocalDate
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
System.out.println("localDate by Instant: " + localDate);
// Date -> LocalTime
LocalTime localTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
System.out.println("localTime by Instant: " + localTime);

//2. Date -> LocalDateTime
localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
System.out.println("localDateTime by ofInstant: " + localDateTime);

JDK8ので、下位互換性を実現するため、JDK8リリースの日付から、2つのメソッドを紹介し
toInstantので、私たちは日へのLocalDateTimeの転換を達成するために、これらの2つのメソッドを使用することができます。:次のように日中のLocalDateTime

LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("localDateTime: " + localDateTime);

// LocalDateTime -> Date
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
System.out.println("LocalDateTime -> current date: " + date);

// LocalDate -> Date,时间默认都是00
LocalDate localDate = LocalDate.now();
date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
System.out.println("LocalDate -> current date: " + date);

日付と文字列の変換

LOCALDATE、にLocalTime、LocalDateTimeを構文解析方法とてDateTimeFormatterによって達成するために:

//字符串->日期
LocalDate localDate = LocalDate.parse("2018-09-09", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
LocalDateTime localDateTime = LocalDateTime.parse("2018-09-10 12:12:12", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

//日期->字符串
String localDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
String localDateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
// 也可以通过DateTimeFormatter的format方法
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
localDateTime = dateTimeFormatter.format(LocalDateTime.now());

タイムスタンプの変換のLocalDateTime

特定以下を達成。

//时间戳->LocalDateTime
public static LocalDateTime convertToDate(long timestamp) {
   // ofEpochSecond 以秒为单位, ofEpochMilli 以毫秒为单位
   // Instant.ofEpochSecond(timestamp);
   Instant instant = Instant.ofEpochMilli(timestamp);
   return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
}

//LocalDateTime->时间戳
public static long convertToTimestamp() {
   LocalDateTime localDateTime = LocalDateTime.now();
   return localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
}

概要

  • 加算、減算、フォーマット、解像度、抽出された日付/時刻から別の部分:すべての新しい日時APIクラスは、次のような一般的なタスクを実行するための多数の方法を実装します。
  • APIのすべてのクラスのための新しい時刻と日付でJava 8は不変で、スレッドセーフな、任意の変更操作は、新しいインスタンスを返しますです。
  • 様々な概念と同様の方法定義モードを使用して、各概念を区別するために、新しい日付と時刻のAPIは、この類似性は、APIを学習に非常に助長しています。一般的なアプローチやメソッドの接頭辞を要約したものです。
    • の:インスタンスを作成するためのstaticファクトリメソッド
    • 今:staticファクトリメソッドは、現在の時刻とのインスタンスを作成します
    • 解析:文字列解析オブジェクトインスタンスから得られる静的ファクトリメソッド、
    • 取得:パーシャル状態オブジェクトの日付と時刻を取得します。
    • です:何かが前と時間後に比較して、例えば、真であるかどうかをチェックします
    • :オブジェクトの日付と時刻コピーの状態変化の一部を返します
    • プラス:時間が増加し、オブジェクトの日付と時刻のコピーを返します。
    • マイナス:オブジェクトの減少した時間を返し、日付と時刻のコピー
    • To:別の型への切り替え
    • で:組み合わせて別のオブジェクトとこのオブジェクト、例えばdate.atTime(時間)
    • フォーマット:日付と時刻のフォーマット化オブジェクトを提供する能力

使用するためのより多くの方法を参照してくださいJavaのAPIドキュメント

参考記事:

http://www.importnew.com/14140.html

https://docs.oracle.com/javase/8/docs/api/

https://www.jianshu.com/p/f4abe1e38e09

おすすめ

転載: www.cnblogs.com/kiwenzhang/p/10960742.html