質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

4回答

3121閲覧

Long型からのDate変換

.Won

総合スコア66

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/01/20 14:37

編集2018/01/21 11:48

私はカレンダーからDateを受け取りたいと思っています。
しかし、Long型のUTCで帰ってきているのでDateに直せません

どのようにすればいいですか?

Java

1// 日付取得箇所 2final String[] EVENT_PROJECTION = new String[]{ 3 Events.CALENDAR_ID, 4 Events.ORGANIZER, 5 Events.ACCOUNT_NAME, 6 Events.TITLE, 7 Events.DESCRIPTION, 8 Events.DTSTART, 9 Events.DTEND 10}; 11ContentResolver cr = getContentResolver(); 12String selection = "(" + Events.ACCOUNT_TYPE + " = ?)"; 13String[] selectionArgs = new String[]{"com.google"}; 14if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) != ckageManager.PERMISSION_GRANTED) { 15 return; 16} 17Cursor cur = cr.query(Events.CONTENT_URI, EVENT_PROJECTION, null, null, null); 18adapter.getItemList().clear(); 19while(cur.moveToNext()){ 20 Toast.makeText(MainActivity.this,cur.getString(cur.getColumnIndex(Events.DTSTART)),Tot.LENGTH_SHORT).show(); 21 Item item = new Item(); 22 item.dtStartLong = cur.getLong(cur.getColumnIndex(Events.DTSTART)); 23 em.setAccountName(cur.getString(cur.getColumnIndex(Events.ACCOUNT_NAME))); 24 item.setId(cur.getString(cur.getColumnIndex(Events.CALENDAR_ID))); 25 item.setTitle(cur.getString(cur.getColumnIndex(Events.TITLE))); 26 item.setDetails(cur.getString(cur.getColumnIndex(Events.DESCRIPTION))); 27 item.setOrganizate(cur.getString(cur.getColumnIndex(Events.ORGANIZER))); 28 item.setDtStart(new Date(cur.getLong(cur.getColumnIndex(Events.DTSTART)))); 29 item.setDtEnd(new Date(cur.getLong(cur.getColumnIndex(Events.DTSTART)))); 30 adapter.getItemList().add(item); 31} 32 33 34 35// 文字列変換箇所 36public String getDtStartToString(){ 37 return String.valueOf(dtStart.getYear() + "年" + dtStart.getMonth()) + "月" + String.valueOf(dtStart.getDay()) + "日"; 38}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yona

2018/01/21 00:55

日付文字列への変換方法が間違っていると思うので、該当箇所のコードを追記してください。
yona

2018/01/21 10:23

値を取得する箇所ではなく、値を日付文字列に変換している箇所を追記してください。
guest

回答4

0

どんなlong値をどういうふうに出力したらその結果が得られたのかを閲覧者に明示することが一番肝心だと思います。次のように書いてあれば曖昧さをかなり排除できます。

java

1long lv = ... 2 3Date d = new Date(lv); 4System.out.printf("lv = %d%n", lv); //(A) 5System.out.printf("date (long) = %d%n", d.getTime()); //(A) 6System.out.printf("date = %s%n", d); //(B) 7System.out.printf("date (mistake) = %4d%02d%02d%02d%02d%02d%n", //(C) 8 d.getYear(), d.getMonth(), d.getDate(), 9 d.getHours(), d.getMinutes(), d.getSeconds()); 10 11===> 12lv = 1412812800000 13date (long) = 1412812800000 14date = Thu Oct 09 09:00:00 JST 2014 15date (mistake) = 1140909090000

(A) どのような数値を用いたのか
(B) (A)があれば必ずしもいらないけど、普通に表示させればどういう日付かはわかる
(C) これは自分の推測です。

これらさえ提示できていれば回答者(閲覧者)を混乱させることはないと思います。事実を共有するのがQ&Aとかデバッグでのポイントですよね・・・

なお、(C)ではないかと推測した根拠はswordoneさんの回答への最初のコメントからです。

そうすると、110年や0月などが返ってきてしまうのです

つまりgetYear()は1900年からの相対年を返し、getMonth()は月を0オリジンで返すという点をご存知ないのかも知れないと思ったのです。ただ、本当に2017年に該当する日付を扱ったのにgetYear()が110とか114になったというなら上記の(C)が原因とはいえません。いずれにせよ**(A)を明示すれば話はもっと単純に進む**と思います。

**肝心かなめの事実を明示しましょう。**そうせずに議論を続けても時間の無駄になりかねないと思います。

投稿2018/01/20 17:34

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

.Won

2018/01/21 11:57 編集

getYearが1900年の相対年でgetMonthが0を返すのを知りませんでした ということは Year = getYear() + 1900 Month = getMonth() + 1 Day = getDay() + 1 ということでしょうか?
guest

0

new Date(long値)でいいのでは?

java

1public static void main (String[] args) { 2 DateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 3 System.out.println(format.format(new Date(1516618800000L))); 4}

出力結果
2018/01/22 11:00:00

時刻は違うけど

投稿2018/01/20 14:41

編集2018/01/21 01:48
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

.Won

2018/01/20 14:45

そうすると、110年や0月などが返ってきてしまうのです
swordone

2018/01/20 14:58

どういう形式ですか? 2018年1月20日が20180120のようになっているとかですか?
.Won

2018/01/20 15:22

1499090900 みたいな感じです
swordone

2018/01/20 15:28

その例が表すべき日時は何ですか?
退会済みユーザー

退会済みユーザー

2018/01/20 16:11 編集

swordone よくある方法でザクっと計算したが多分 2017年の6月あたり?
.Won

2018/01/21 00:56 編集

1140909090000 で 114年9月9日みたいな感じです ただ、2017年のスケジュールを受け取っているので この値はおかしいものです 01/21 すみません こちらの値は間違っていました
退会済みユーザー

退会済みユーザー

2018/01/20 15:54

だとするとうちの回答は誤答になるな
swordone

2018/01/20 16:16

「おかしいもの」は値ではなく解釈ではないですか? 私は「その値が表すべき日時」を聞いているのであって あなたがどう読み取るかは聞いていません。
.Won

2018/01/21 00:49

Long : 1516618800000 表示される日付:118年0月1日 正しい日付:2018年1月22日08時00分
.Won

2018/01/21 00:50

という形です
guest

0

ベストアンサー

使っているメソッドは非推奨になっていませんか?
Date#getYearは1900年からの経過年数を返すらしいので2010年だと110年になりますね。
SimpleDateformatを使いましょう。

投稿2018/01/21 11:57

編集2018/01/21 11:59
yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

.Won

2018/01/21 13:26

Dateが1900年からっ始まっていることを知りませんでした。 SimpleDateformatを使い、直してからもう一度Dateに入れることで 上手く解決することができました 皆さんありがとうございました
yona

2018/01/21 13:50

それはどのような方法で解決しましたか? コメントからは最悪の解決法をした可能性があります。
guest

0

まず 1499090900 ですが、47年半程度(1970年1月1日からの秒数)だとおもわれるので1000倍にして秒にする必要があります。

さらにカレンダー等で1900年1月1日~1970年1月1日を計算して加算する必よ卯があります。

それから new Date(long) を利用してください。
というかカレンダー型で計算したほうがいいですね。

/* package whatever; // don't place package name! */ import java.util.*; import java.lang.*; import java.io.*; /* Name of the class has to be "Main" only if the class is public. */ class Ideone { public static void main (String[] args) throws java.lang.Exception { Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, 1970); c.set(Calendar.MONTH, 0); c.set(Calendar.DAY_OF_MONTH, 1); c.add(Calendar.SECOND, 1499090900); System.out.println(c.getTime().getTime()); // 1900年1月1日からのミリ秒 System.out.println(c.getTime()); // Date型 } }

https://ideone.com/ZoC2g4

ミリ秒がついてきたのでそのタイプ

/* package whatever; // don't place package name! */ import java.util.*; import java.lang.*; import java.io.*; /* Name of the class has to be "Main" only if the class is public. */ class Ideone { public static void main (String[] args) throws java.lang.Exception { Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, 1970); c.set(Calendar.MONTH, 0); c.set(Calendar.DAY_OF_MONTH, 1); c.add(Calendar.SECOND, (int)(1516618800000L / 1000)); System.out.println(c.getTime().getTime()); // 1900年1月1日からのミリ秒 System.out.println(c.getTime()); // Date型 } }

https://ideone.com/fXUB4x

投稿2018/01/20 15:30

編集2018/01/21 03:52
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/20 16:03

1140909が 3桁が年ならこれはあてはまりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問