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

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

ただいまの
回答率

90.51%

  • Java

    13828questions

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

  • Android Studio

    3711questions

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

Long型からのDate変換

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,969

.Won

score 38

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

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

// 日付取得箇所
final String[] EVENT_PROJECTION = new String[]{
        Events.CALENDAR_ID,
        Events.ORGANIZER,
        Events.ACCOUNT_NAME,
        Events.TITLE,
        Events.DESCRIPTION,
        Events.DTSTART,
        Events.DTEND
};
ContentResolver cr = getContentResolver();
String selection = "(" + Events.ACCOUNT_TYPE + " = ?)";
String[] selectionArgs = new String[]{"com.google"};
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) != ckageManager.PERMISSION_GRANTED) {
    return;
}
Cursor cur = cr.query(Events.CONTENT_URI, EVENT_PROJECTION, null, null, null);
adapter.getItemList().clear();
while(cur.moveToNext()){
    Toast.makeText(MainActivity.this,cur.getString(cur.getColumnIndex(Events.DTSTART)),Tot.LENGTH_SHORT).show();
    Item item = new Item();
    item.dtStartLong = cur.getLong(cur.getColumnIndex(Events.DTSTART));
    em.setAccountName(cur.getString(cur.getColumnIndex(Events.ACCOUNT_NAME)));
    item.setId(cur.getString(cur.getColumnIndex(Events.CALENDAR_ID)));
    item.setTitle(cur.getString(cur.getColumnIndex(Events.TITLE)));
    item.setDetails(cur.getString(cur.getColumnIndex(Events.DESCRIPTION)));
    item.setOrganizate(cur.getString(cur.getColumnIndex(Events.ORGANIZER)));
    item.setDtStart(new Date(cur.getLong(cur.getColumnIndex(Events.DTSTART))));
    item.setDtEnd(new Date(cur.getLong(cur.getColumnIndex(Events.DTSTART))));
    adapter.getItemList().add(item);
}



// 文字列変換箇所
public String getDtStartToString(){
    return String.valueOf(dtStart.getYear() + "年" + dtStart.getMonth()) + "月" + String.valueOf(dtStart.getDay()) + "日";
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yona

    2018/01/21 09:55

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

    キャンセル

  • yona

    2018/01/21 19:23

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

    キャンセル

回答 4

+3

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

long lv = ...

Date d = new Date(lv);
System.out.printf("lv             = %d%n", lv);                 //(A)
System.out.printf("date (long)    = %d%n", d.getTime());        //(A)
System.out.printf("date           = %s%n", d);                  //(B)
System.out.printf("date (mistake) = %4d%02d%02d%02d%02d%02d%n", //(C)
        d.getYear(), d.getMonth(), d.getDate(),
        d.getHours(), d.getMinutes(), d.getSeconds());

===>
lv             = 1412812800000
date (long)    = 1412812800000
date           = Thu Oct 09 09:00:00 JST 2014
date (mistake) =  1140909090000

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/21 20:56 編集

    getYearが1900年の相対年でgetMonthが0を返すのを知りませんでした

    ということは
    Year = getYear() + 1900
    Month = getMonth() + 1
    Day = getDay() + 1
    ということでしょうか?

    キャンセル

+2

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

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

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

時刻は違うけど

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/20 23:45

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

    キャンセル

  • 2018/01/20 23:58

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

    キャンセル

  • 2018/01/21 00:22

    1499090900
    みたいな感じです

    キャンセル

  • 2018/01/21 00:28

    その例が表すべき日時は何ですか?

    キャンセル

  • 2018/01/21 00:34 編集

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

    キャンセル

  • 2018/01/21 00:52 編集

    1140909090000

    114年9月9日みたいな感じです
    ただ、2017年のスケジュールを受け取っているので
    この値はおかしいものです

    01/21
    すみません
    こちらの値は間違っていました

    キャンセル

  • 2018/01/21 00:54

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

    キャンセル

  • 2018/01/21 01:16

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

    キャンセル

  • 2018/01/21 09:49

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

    キャンセル

  • 2018/01/21 09:50

    という形です

    キャンセル

checkベストアンサー

+1

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/21 22:26

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

    皆さんありがとうございました

    キャンセル

  • 2018/01/21 22:50

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

    キャンセル

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/21 01:03

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

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13828questions

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

  • Android Studio

    3711questions

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