iOSの日付計算でよく使うオレオレメソッドをまとめてみる

iOSの日付周りの計算でよく使うメソッドをまとめてみた。随時更新予定です。

該当月の開始日と終了日を返す


    func getStartDateAndEndDate(year:Int,month:Int) -> (NSDate,NSDate) {
        
        var calendar:NSCalendar = NSCalendar.currentCalendar()
        calendar.timeZone = NSTimeZone.localTimeZone()
                        
        var components:NSDateComponents = calendar.components(
            NSCalendarUnit.EraCalendarUnit | NSCalendarUnit.YearCalendarUnit | NSCalendarUnit.MonthCalendarUnit
                | NSCalendarUnit.DayCalendarUnit | NSCalendarUnit.HourCalendarUnit
            , fromDate: NSDate())
                
        components.year = year
        components.month = month
        components.day = 1
        components.hour = 0
                
        var startDate:NSDate = calendar.dateFromComponents(components) as NSDate!
        var endDate:NSDate = startDate.lastDayOfTheMonth()
        
        return (startDate,endDate)
   }

   func lastDayOfTheMonth() -> NSDate {
        var calendar:NSCalendar = NSCalendar.currentCalendar()
        var components:NSDateComponents = calendar.components(NSCalendarUnit.YearCalendarUnit | NSCalendarUnit.MonthCalendarUnit | NSCalendarUnit.WeekCalendarUnit  | NSCalendarUnit.WeekCalendarUnit,  fromDate: self)
        
        components.month = components.month + 1
        components.day = 0
        
        let _lastDay:NSDate = calendar.dateFromComponents(components) as NSDate!
        return _lastDay

    }

タイムゾーンに準じた現在の日付を返す

 func localDate() -> NSDate {
        var date:NSDate = NSDate()
                
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "yyyy/MM/dd HH:mm"
        let timeZone = NSTimeZone(name: NSTimeZone.systemTimeZone().name)
        dateFormatter.timeZone = timeZone
        
        
        var dStr = dateFormatter.stringFromDate(date)
        return dateFormatter.dateFromString(dStr)!
        
    }

NSDateをStringに変換する

  func toStr(date:NSDate) -> String {
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "yyyy/MM/dd HH:mm"
        let timeZone = NSTimeZone(name: NSTimeZone.systemTimeZone().name)
        dateFormatter.timeZone = timeZone
        
        
        var dStr:String = dateFormatter.stringFromDate(date)
        return dStr
        
    }

フォームの二重送信を防ぐサンプル


<form id="myForm">
<button onclick="window.submitForm();">投稿する</button>
</form>
submitを連打すると複数の投稿が行えなくする方法のひとつにbutton.disabledの状態を利用すればうまくいく。

JavaScript


window.submitForm = function(btn){
 if (btn.disabled == true){ 
   return; 
 }else{
    btn.disabled = true; 
    var form = $("#myForm"); $(form).submit(); 
 } 
}

SwiftでAdmobの広告を埋め込む

SwiftでAdmobを使えるようにするのにハマったのでここにメモしておく。

Admobをダウンロード

Admobのファイルはこちらからダウンロードできます。
次にAdmobを使用するのに必要なフレームワークもプロジェクトに追加してください。
必要なフレームワークは以下のとおりです。
  • AdSupport
  • AudioToolbox
  • AVFoundation
  • CoreGraphics
  • CoreTelephony
  • EventKit
  • EventKitUI
  • MessageUI
  • StoreKit
  • SystemConfiguration

Build Settingsで swiftBridgeHeaderファイルのパスを設定

スクリーンショット 2014-12-10 10.24.02

次に

Xcode → File → New
を選択してAdmobBridge.h というHeaderFileを以下の内容で作成します。なお、このファイルは上で記載したPathに置いてください。


#ifdef
#import "GADBannerView.h"
#endif

これでSwiftからGADBannerViewを使えるようになりました!あとはViewControllerに以下のようなコードを書くだけで広告を配置することができます。

ViewController.m

private func getBannerView() -> GADBannerView{
        // return Admob's banner view.
        var bannerView: GADBannerView = GADBannerView();
        
        bannerView = GADBannerView(adSize:kGADAdSizeBanner);
        bannerView.frame.origin = CGPointMake(0, self.view.frame.size.height-50)
        bannerView.frame.size = CGSizeMake(self.view.frame.size.width,50)
        bannerView.adUnitID = "your_admob_id"
        bannerView.delegate = self
        bannerView.rootViewController = self
        
        var request:GADRequest = GADRequest()
        request.testDevices = [GAD_SIMULATOR_ID]
    
        bannerView.loadRequest(request)
     
        return bannerView
        
    }

    override func viewDidLoad() {
        let bannerView:GADBannerView = getBannerView()
        self.view.addSubview(bannerView)
    }

[Android] アプリを一旦停止して、再び起動した時にWebViewの最後に訪れたURLをロードする

ハマったのでメモ。 結論から言うとonResume メソッドをActivityにオーバーライドすればいい。

ちなみに下のコードのlastURL、activeWebViewはインスタンス変数で最後に訪れたurlと現在のwebViewを参照している。

Code

@Override
    protected void onResume() {
        super.onResume();
       
        if (lastURL != "")
            activeWebView.loadUrl(lastURL);
    }

DjangoのAdmin画面から日本語の文字を入力するとCaught UnicodeEncodeError while rendering: ‘ascii’ のエラーが出る件について

Djangoははモデルの属性値としてUnicode文字列を返すので、モデルに__unicode__() メソッドを実装すればこのようなエラーは解決できる。

class YourModel(models.Model):

    def __unicode__(self):
        return u"{}".format(self.your_field)

公式サイトを見たら一発で解決だった。