回答:
のゲッターを使用できますjava.time.LocalDateTime
。
LocalDateTime now = LocalDateTime.now();
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
int millis = now.get(ChronoField.MILLI_OF_SECOND); // Note: no direct getter available.
System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);
または、Java 8をまだ使用していない場合は、を使用してくださいjava.util.Calendar
。
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH) + 1; // Note: zero based!
int day = now.get(Calendar.DAY_OF_MONTH);
int hour = now.get(Calendar.HOUR_OF_DAY);
int minute = now.get(Calendar.MINUTE);
int second = now.get(Calendar.SECOND);
int millis = now.get(Calendar.MILLISECOND);
System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);
いずれにせよ、これは今のところ印刷されます:
2010-04-16 15:15:17.816
をに変換するint
にはString
、を利用しString#valueOf()
ます。
結局のところ、人にやさしい文字列形式で配置して表示することが目的である場合は、Java8 java.time.format.DateTimeFormatter
(チュートリアルはこちら)のいずれかを使用することをお勧めします。
LocalDateTime now = LocalDateTime.now();
String format1 = now.format(DateTimeFormatter.ISO_DATE_TIME);
String format2 = now.atZone(ZoneId.of("GMT")).format(DateTimeFormatter.RFC_1123_DATE_TIME);
String format3 = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss", Locale.ENGLISH));
System.out.println(format1);
System.out.println(format2);
System.out.println(format3);
または、Java 8をまだ使用していない場合は、次を使用しますjava.text.SimpleDateFormat
。
Date now = new Date(); // java.util.Date, NOT java.sql.Date or java.sql.Timestamp!
String format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(now);
String format2 = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH).format(now);
String format3 = new SimpleDateFormat("yyyyMMddHHmmss", Locale.ENGLISH).format(now);
System.out.println(format1);
System.out.println(format2);
System.out.println(format3);
いずれにせよ、これにより次の結果が得られます。
2010-04-16T15:15:17.816 2010年4月16日金曜日15:15:17 GMT 20100416151517
SimpleDateFormat
かDateTimeFormatter
:)
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
joda-timeに切り替えると、これを3行で実行できます
DateTime jodaTime = new DateTime();
DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS");
System.out.println("jodaTime = " + formatter.print(jodaTime));
カレンダーを使用せずに、日付の個々のフィールドに直接アクセスすることもできます。
System.out.println("year = " + jodaTime.getYear());
System.out.println("month = " + jodaTime.getMonthOfYear());
System.out.println("day = " + jodaTime.getDayOfMonth());
System.out.println("hour = " + jodaTime.getHourOfDay());
System.out.println("minute = " + jodaTime.getMinuteOfHour());
System.out.println("second = " + jodaTime.getSecondOfMinute());
System.out.println("millis = " + jodaTime.getMillisOfSecond());
出力は次のとおりです。
jodaTime = 2010-04-16 18:09:26.060
year = 2010
month = 4
day = 16
hour = 18
minute = 9
second = 26
millis = 60
http://www.joda.org/joda-time/によると
Joda-Timeは、Javaの事実上の標準の日時ライブラリです。Java SE 8以降では、ユーザーはjava.time(JSR-310)への移行を求められます。
// Java 8
System.out.println(LocalDateTime.now().getYear()); // 2015
System.out.println(LocalDateTime.now().getMonth()); // SEPTEMBER
System.out.println(LocalDateTime.now().getDayOfMonth()); // 29
System.out.println(LocalDateTime.now().getHour()); // 7
System.out.println(LocalDateTime.now().getMinute()); // 36
System.out.println(LocalDateTime.now().getSecond()); // 51
System.out.println(LocalDateTime.now().get(ChronoField.MILLI_OF_SECOND)); // 100
// Calendar
System.out.println(Calendar.getInstance().get(Calendar.YEAR)); // 2015
System.out.println(Calendar.getInstance().get(Calendar.MONTH ) + 1); // 9
System.out.println(Calendar.getInstance().get(Calendar.DAY_OF_MONTH)); // 29
System.out.println(Calendar.getInstance().get(Calendar.HOUR_OF_DAY)); // 7
System.out.println(Calendar.getInstance().get(Calendar.MINUTE)); // 35
System.out.println(Calendar.getInstance().get(Calendar.SECOND)); // 32
System.out.println(Calendar.getInstance().get(Calendar.MILLISECOND)); // 481
// Joda Time
System.out.println(new DateTime().getYear()); // 2015
System.out.println(new DateTime().getMonthOfYear()); // 9
System.out.println(new DateTime().getDayOfMonth()); // 29
System.out.println(new DateTime().getHourOfDay()); // 7
System.out.println(new DateTime().getMinuteOfHour()); // 19
System.out.println(new DateTime().getSecondOfMinute()); // 16
System.out.println(new DateTime().getMillisOfSecond()); // 174
// Formatted
// 2015-09-28 17:50:25.756
System.out.println(new Timestamp(System.currentTimeMillis()));
// 2015-09-28T17:50:25.772
System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(new Date()));
// Java 8
// 2015-09-28T17:50:25.810
System.out.println(LocalDateTime.now());
// joda time
// 2015-09-28 17:50:25.839
System.out.println(DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS").print(new org.joda.time.DateTime()));
Java 8以降では、java.timeパッケージを使用します。
ZonedDateTime.now().getYear();
ZonedDateTime.now().getMonthValue();
ZonedDateTime.now().getDayOfMonth();
ZonedDateTime.now().getHour();
ZonedDateTime.now().getMinute();
ZonedDateTime.now().getSecond();
ZonedDateTime.now()
デフォルトのタイムゾーンでシステムクロックから現在の日時を返す静的メソッドです。すべてのgetメソッドはint
値を返します。
LocalDateTime
これはまさに間違ったクラスです。タイムゾーンのいずれかの概念を欠いているか、オフセットから-UTC、それはできません特定の瞬間を追跡するために使用され、それがないタイムライン上のポイント。使用Instant
、ZonedDateTime
またはOffsetDateTime
その代わり。
ZonedDateTime
。
ZonedDateTime.now( // Capture current moment as seen in the wall-clock time used by the people of a particular region (a time zone).
ZoneId.of( "America/Montreal" ) // Specify desired/expected time zone. Or pass `ZoneId.systemDefault` for the JVM’s current default time zone.
) // Returns a `ZonedDateTime` object.
.getMinute() // Extract the minute of the hour of the time-of-day from the `ZonedDateTime` object.
42
ZonedDateTime
特定の地域(タイムゾーン)の人々が使用する実時間で表示される現在の瞬間をキャプチャするには、を使用しますZonedDateTime
。
日付を決定するには、タイムゾーンが重要です。いつでも、日付は世界中でゾーンごとに異なります。たとえば、パリの真夜中から数分後のフランスは新しい日ですが、モントリオールケベックでは「昨日」です。
タイムゾーンが指定されていない場合、JVMは暗黙的に現在のデフォルトのタイムゾーンを適用します。そのデフォルトは実行時(!)のどの時点でも変わる可能性があるため、結果は異なる場合があります。引数として希望/予想タイムゾーンを明示的に指定することをお勧めします。
指定適切なタイムゾーン名をの形式でcontinent/region
、のようなAmerica/Montreal
、Africa/Casablanca
またはPacific/Auckland
。決してなど3-4文字の略称を使用していないEST
か、IST
そのままではない真の時間帯ではなく、標準化、さらには一意ではありません(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
多くのゲッターのいずれかを呼び出して、日時の一部を引き出します。
int year = zdt.getYear() ;
int monthNumber = zdt.getMonthValue() ;
String monthName = zdt.getMonth().getDisplayName( TextStyle.FULL , Locale.JAPAN ) ; // Locale determines human language and cultural norms used in localizing. Note that `Locale` has *nothing* to do with time zone.
int dayOfMonth = zdt.getDayOfMonth() ;
String dayOfWeek = zdt.getDayOfWeek().getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ;
int hour = zdt.getHour() ; // Extract the hour from the time-of-day.
int minute = zdt.getMinute() ;
int second = zdt.getSecond() ;
int nano = zdt.getNano() ;
java.timeのクラスはに解決ナノ秒。あなたの質問はミリ秒の秒の端数を尋ねました。明らかに、100万で割り、ナノ秒からミリ秒に切り捨てることができますが、データが失われる可能性があります。またはTimeUnit
、そのような変換には列挙型を使用します。
long millis = TimeUnit.NANOSECONDS.toMillis( zdt.getNano() ) ;
DateTimeFormatter
String
テキストを組み合わせるためのを生成するには、DateTimeFormatter
クラスを使用します。詳細については、スタックオーバーフローを検索してください。
Instant
通常、UTCで瞬間を追跡するのが最適です。ゾーン化された日時からUTCに調整するには、を抽出しInstant
ます。
Instant instant = zdt.toInstant() ;
そして再び戻ってください。
ZonedDateTime zdt = instant.atZone( ZoneId.of( "Africa/Tunis" ) ) ;
LocalDateTime
他のいくつかの回答がLocalDateTime
クラスを使用しています。このクラスは、タイムゾーンやUTCからのオフセットの概念を意図的に欠いているため、実際の瞬間、タイムライン上の特定の瞬間を追跡する目的には適していません。
それで、何がLocalDateTime
良いのですか?特定の1つの地域ではなく、任意の地域またはすべての地域にLocalDateTime
日付と時刻を適用する場合に使用します。
たとえば、今年のクリスマスはで始まりLocalDateTime.parse( "2018-12-25T00:00:00" )
ます。その値は、タイムゾーン(a ZoneId
)を適用してを取得するまで意味がありませんZonedDateTime
。クリスマスは最初にキリバスで行われ、その後ニュージーランドと極東アジアで行われます。数時間後、クリスマスはインドで始まります。アフリカとヨーロッパではさらに1時間後。そして、まだ数時間後までアメリカ大陸のクリスマスではありません。1つの場所で始まるクリスマスは、で表す必要がありZonedDateTime
ます。どこでもクリスマスはで表されますLocalDateTime
。
java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.Date
、Calendar
、& SimpleDateFormat
。
ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。
詳細については、Oracleチュートリアルを参照してください。また、スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。
java.timeオブジェクトをデータベースと直接交換することができます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*
java.timeクラスはどこで入手できますか?
または、java.sql.Timestampを使用します。カレンダーはやや重いので、量産コードでは使用しないことをお勧めします。ジョーダは良いです。
import java.sql.Timestamp;
public class DateTest {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(new Timestamp(System.currentTimeMillis()));
}
}
new Date()
ここで使用します。しかし、要求に応じてどのようにして個別のパーツを簡単に入手できますか?
java.sql.Timestamp
にjava.time.Instant
、JDBC 4.2の登場によりに取って代わられました。
Java 7カレンダーの1行
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(Calendar.getInstance().getTime())
java.util.Calendarクラスとその派生物のAPIドキュメントをご覧ください(GregorianCalendarクラスに特に興味があるかもしれません)。
java.util.Date
、java.util.Calendar
とjava.text.SimpleDateFormat
今のレガシーに取って代わられ、java.timeの後にJavaの8とに組み込まれたクラス。Oracleによるチュートリアルを参照してください。
Calendar now = new Calendar()//または新しいGregorianCalendar()、または必要なフレーバー
now.MONTH now.HOUR
等
MONTH
およびのHOUR
静的定数でありCalendar
、インスタンスプロパティではありません。