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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2856閲覧

Swift 3でJSONから取得したUNIX時間を曜日に変換する方法

mym

総合スコア12

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/07/10 14:14

編集2017/07/10 23:36

###前提・実現したいこと
Swift 3でJSONから取得したUNIX時間を曜日に変換したいのですが、どのようにすれば良いか分からず困っています。APIはOpenWeatherMapです。プログラム自体初めてで、Swiftを学び始めて2ヵ月の初心者です。天気予報アプリを作っています。よろしくお願いします。
追記 SwiftyJSONというライブラリを使用しています。

###発生している問題・エラーメッセージ
6行目の"dateFormatter.dateFormat"に赤線が付き、
Cannot call value of non-function type 'String!'

###該当のソースコード
let unixTime1 = json["list"][0]["dt"]
let stringTime1 = unixTime1
let dateFormatter = DateFormatter()
//dateFormatter.timeZone = NSTimeZone.system
dateFormatter.dateFormat = "EEE"
let day1 = dateFormatter.dateFormat(from: stringTime1)
self.weekLabel.text = String(describing: day1)

###試したこと
何時間も検索したのですが見つけられません。

###補足情報(言語/FW/ツール等のバージョンなど)
Swift 3
Xcode 8
SwiftyJSON

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

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

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

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

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

guest

回答1

0

ベストアンサー

swift

1 let dt = "1499701500" 2 3 if let unixTime1 = TimeInterval(dt) { 4 print(unixTime1) // 1499701500.0 5 let stringTime1 = Date(timeIntervalSince1970: unixTime1) 6 print(stringTime1) // 2017-07-10 15:45:00 +0000 7 let dateFormatter = DateFormatter() 8 dateFormatter.dateFormat = "EEE" 9 let day1 = dateFormatter.string(from: stringTime1) 10 print(day1) // Tue 11 } 12

追記

swift

1import UIKit 2import SwiftyJSON 3 4class ViewController: UIViewController { 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 // Do any additional setup after loading the view, typically from a nib. 9 var json: JSON = ["list": [["dt": 1499701500], ["dt": "1499701500"]]] 10 11 print(json) 12 13 if let dt = json["list"][0]["dt"].int { 14 let unixTime1 = TimeInterval(dt) 15 print(unixTime1) // 1499701500.0 16 let stringTime1 = Date(timeIntervalSince1970: unixTime1) 17 print(stringTime1) // 2017-07-10 15:45:00 +0000 18 let dateFormatter = DateFormatter() 19 dateFormatter.dateFormat = "EEE" 20 let day1 = dateFormatter.string(from: stringTime1) 21 print(day1) // Tue 22 } else { 23 print(json["list"][0]["dt"].error!) 24 } 25 26 if let dt = json["list"][1]["dt"].string { 27 let unixTime1 = TimeInterval(dt) 28 print(unixTime1) // Optional(1499701500.0) 29 let stringTime1 = Date(timeIntervalSince1970: unixTime1!) 30 print(stringTime1) // 2017-07-10 15:45:00 +0000 31 let dateFormatter = DateFormatter() 32 dateFormatter.dateFormat = "EEE" 33 let day1 = dateFormatter.string(from: stringTime1) 34 print(day1) // Tue 35 } else { 36 print(json["list"][1]["dt"].error!) 37 } 38 39 let dtTestString: String = json["list"][0]["dt"].stringValue 40 print(dtTestString) 41 let dtTestInt: Int = json["list"][1]["dt"].intValue 42 print(dtTestInt) 43 } 44 45 override func didReceiveMemoryWarning() { 46 super.didReceiveMemoryWarning() 47 // Dispose of any resources that can be recreated. 48 } 49 50 51}

json

1{ 2 "list" : [ 3 { 4 "dt" : 1499701500 5 }, 6 { 7 "dt" : "1499701500" 8 } 9 ] 10}

"dt" : 1499701500"dt" : "1499701500"かによって多少取り扱いが変わってきますね。
.stringはもう少し慎重に取り扱いましょう。.intValueでも取れるようですけど、値の確認は必要でしょう。

投稿2017/07/10 16:10

編集2017/07/11 05:48
izkn

総合スコア1698

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

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

mym

2017/07/10 23:38 編集

回答ありがとうございます。アプリで自動的に表示する際に、json["list"][0]["dt"] を "1499701500" に変換するやり方が分かりません。自分でコンバーターを使って変換することはできますが。 ちなみに、let dt = json["list"][0]["dt"] として、作ってくださったコードを入れてみましたが、2行目のTimeIntervalに赤線で「Cannot invoke initializer for type 'TimeInterval' with an argument list of type '(JSON)'」とエラーになりました。
fuzzball

2017/07/11 00:27

json["list"][0]["dt"].string でいけるかも。
izkn

2017/07/11 05:49

助言感謝いたします。
mym

2017/07/11 07:48

izknさん、ご丁寧に検証してくださり、ありがとうございます! fuzzballさんも助言ありがとうございました。自分でもあれこれやって、Doubleにして表示成功しました。 これを4日分つくるのですが、dateFormatterの処理のところなど、4回繰り返してもいいのか、それよりfor文か何かで書くものなのでは?と調べています。もしよろしければ、また助言いただけたらありがたいです。
mym

2017/07/11 07:55

実際のコード let dt1 = json["list"][1]["dt"] let date1 = dt1.double let unixTime1 = TimeInterval(date1!) let stringTime1 = Date(timeIntervalSince1970: TimeInterval(unixTime1)) let dateFormatter = DateFormatter() dateFormatter.dateFormat = "EEE" let day1 = dateFormatter.string(from: stringTime1) let i1 = json["list"][1]["weather"][0]["icon"] let p1 = json["list"][1]["pressure"] self.wL1.text = "\(day1)".capitalized self.iL1.image = UIImage(named: "\(i1)" + ".image") self.pL1.text = "\(p1)" 「Tue」を「TUE」と大文字にしたいのですが、capitalizedが効きません。これは国ごとの表示の決まりのせいでしょうか?
izkn

2017/07/11 08:51

let dateFormatter = DateFormatter() dateFormatter.dateFormat = "EEE" これは最初の一回だけで良いです。for文で回すなら、ループの外に出してください。 > capitalizedが効きません。 ja_JPだと駄目なのかもしれませんね。単純に大文字にするなら、以下で。 print(day1.uppercased())
mym

2017/07/11 14:38

おかげで完成しました! 大文字にもできました。ありがとうございました! let dateFormatter = DateFormatter() dateFormatter.dateFormat = "EEE" for n in 1...4 { let dt = json["list"][n]["dt"] let date = dt.double let unixTime = TimeInterval(date!) let stringTime = Date(timeIntervalSince1970: TimeInterval(unixTime)) let day = dateFormatter.string(from: stringTime) let image = json["list"][n]["weather"][0]["icon"] let press = json["list"][n]["pressure"] let daysName = self.value(forKey: "d\(n)") as! UILabel daysName.text = String("\(day)").uppercased() let imageName = self.value(forKey: "i\(n)") as! UIImageView imageName.image = UIImage(named: "\(image)" + ".image") let pressName = self.value(forKey: "p\(n)") as! UILabel pressName.text = String("\(press) + hPa") }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問