swift4 DateFormatter->string 日時と文字列の相互変換で9時間ずれる ので ずれないようにする
はじめに
今回はswiftを使った日付操作で気がついたことのメモ。swiftではDate、Locale、TimeZone、DateFormatter、など考慮したその一例です、ある日時に対して、DateFormatterを利用した「Date<-->String」の相互変換をswiftで書いてみます。
TimeZoneを意識せず実装してみる
DateとStringが異る日時
let e0 = DateFormatter() e0.dateFormat = "yyyy-MM-dd HH:mm:ss" let e1 = Date() let e2 = e0.string(from: e1) let e3 = e0.date(from: e2)
TimeZoneを日本時間に固定してみる
DateとStringが同じ日時
let d1 = Date.current let d2 = DateFormatter.current("yyyy-MM-dd HH:mm:ss").string(from: d1) let d3 = DateFormatter.current("yyyy-MM-dd HH:mm:ss").date(from: d2) extension TimeZone { static let gmt = TimeZone(secondsFromGMT: 0)! static let jst = TimeZone(identifier: "Asia/Tokyo")! } extension Locale { static let japan = Locale(identifier: "ja_JP") } extension DateFormatter { static func current(_ dateFormat: String) -> DateFormatter { let df = DateFormatter() df.timeZone = TimeZone.gmt df.locale = Locale.japan df.dateFormat = dateFormat return df } } extension Date { static var current: Date = Date(timeIntervalSinceNow: TimeInterval(TimeZone.jst.secondsFromGMT())) }
まとめ
以前に書いたカレンダーの記事では・・・
ということで??、例えば、0:0:0 や 23:59:59 正しい日時を扱えるように。
ab39
コンピュータ:負数と補数:2の補数を理解する
はじめに
多くのコンピュータでは一般的に負数は2の補数で表現されているようで、その理由の一つには減算を加算として扱えるようになることがあるみたいです。その方が良いみたいです。こういうの・・演算装置(CPU的な)の話かな・・ 今回はこの2の補数表現に注目して整理します。
表現できる範囲
nビットであれば:-2n-1 ~ 2n-1-1
int型(32ビット)であれば:-231 ~ 231-1:-2,147,483,648 ~ 2,147,483,647
実用例を用いた検証
前の記事で扱った内容を用いて確認してみます
Java実装:カラーコードの定義
"ピーコック", 0xFF46D6DB "ミカン", 0xFFFFB878 "バナナ", 0xFFFBD75B "バジル", 0xFF51B749 "セージ", 0xFF7AE7BF "ブルーベリー", 0xFF5484ED "ラベンダー", 0xFFA4BDFC "ブドウ", 0xFFDBADFF "フラミンゴ", 0xFFFF887C "グラファイト", 0xFFE1E1E1
Swift実装:カラーコードの定義
"ピーコック": -12134693 "ミカン": -18312 "バナナ": -272549 "バジル": -11421879 "セージ": -8722497 "ブルーベリー": -11238163 "ラベンダー": -5980676 "ブドウ": -2380289 "フラミンゴ": -30596 "グラファイト": -1973791
16進数->2進数->1の補数->2の補数->絶対値->10進数
マスク表現でRBGを確認
extension UIColor { static func create(hex: Int) -> UIColor { return UIColor( displayP3Red: CGFloat((hex & 0xFF0000) >> 16) / 255.0 , green: CGFloat((hex & 0xFF00) >> 8) / 255.0 , blue: CGFloat(hex & 0xFF) / 255.0 , alpha: 1.0 ) } }
まとめ
Java実装とSwift実装で同じ定義という検証をしました。上の定義も計算違いなどで軽微な間違いがあるかもしれません、もしそうでも、ここではそれは置いておくとして(-_-;)、個人見解「根拠説明できる実装」が大切、基本だし・・まあ理想かなと・・。
日当-ヒナタ- swift4 -7- UIColorをIntで扱う
はじめに
Androidアプリ日当-ヒナタ-のiOS版を作り始めたのでその経過を少しアップします。普段の仕事ではSWIFTを触らないのでとても新鮮な感じと少し不安なとこもあり。。。少し機能を削り、早めのストア公開を目指します。 picker系のコントロールが少し手こずります。Androidでは0xFFFFFFFFのような感じでARGBを指定しました。iOSというかSWIFTではエラーになるので、とりあえず負数を直接定義したのですが、他に方法がないのでしょうかね。。(符号あり(先頭ビット[1]でマイナス)+16進記述の整数リテラル)
機材
・Macbook air Xcode Version 10.1 Apple Swift version 4.2.1
・iphone5c テスト機
UIColorをIntで扱う。
保存する時は選択した色の数字をRealmへ保存してます。コンピュータ的には良いですが、コメントで16進書いとかないとわからなくなりますね ・・ あ、、それと、透明度が扱えないかも。。
--- --- --- --- let list: DictionaryLiteral = [ "ピーコック": -12134693, "ミカン": -18312, "バナナ": -272549, "バジル": -11421879, "セージ": -8722497, "ブルーベリー": -11238163, "ラベンダー": -5980676, "ブドウ": -2380289, "フラミンゴ": -30596, "グラファイト": -1973791 ] //使い方 UIColor.create(hex: -11421879) UIColor.create(hex: list[3].value) --- --- --- --- --- extension UIColor { static func create(hex: Int) -> UIColor { return UIColor( displayP3Red: CGFloat((hex & 0xFF0000) >> 16) / 255.0 , green: CGFloat((hex & 0xFF00) >> 8) / 255.0 , blue: CGFloat(hex & 0xFF) / 255.0 , alpha: 1.0 ) } } --- --- --- ---
参考:Androidの定義。
"ピーコック", 0xFF46D6DB "ミカン", 0xFFFFB878) "バナナ", 0xFFFBD75B "バジル", 0xFF51B749 "セージ", 0xFF7AE7BF "ブルーベリー", 0xFF5484ED "ラベンダー", 0xFFA4BDFC "ブドウ", 0xFFDBADFF "フラミンゴ", 0xFFFF887C "グラファイト", 0xFFE1E1E1
動作イメージ
ほぼほぼ、完成。。
ab39