B-Teck!

お仕事からゲームまで幅広く

【Kotlin】文字列の日時が指定の期間内に含まれているかを判定する

KotlinのDateにはRange演算子(Ranges - Kotlin Programming Language)が実装されているので、
簡単に大小や範囲を判定することができる。

下記は文字列の日時をSimpleDateFormatでDateに変換して、
0時から3時の間に含まれるかを判定しているサンプル。

 import java.text.SimpleDateFormat
 fun main() {
     println(isDateInRange("2018-11-26T01:50:00")) // true
     println(isDateInRange("2018-11-26T08:50:00")) // false
 }

fun isDateInRange(input : String) :Boolean {
    return SimpleDateFormat("yyyy-MM-dd'T'HH:mm").let{
        // 年月日だけ取り出す
         val date = SimpleDateFormat("yyyy-MM-dd").let{
             val parsed = it.parse(input)
             it.format(parsed)
         }
         // 指定範囲を作る(例として0時から3時)
         val range = it.parse("${date}T00:00:00")..it.parse("${date}T03:00:00")
         // 含まれているかを確認する
         range.contains(it.parse(input))
    }
}

【JavaScript/jQuery】後から生成されたDOMからイベントを発火させる

jQueryの場合

昔こういう事するときはjQueryのlive()を利用していたんだけど、1.9で死んでた。

$("p").live("click", function(){
    $(this).after("<p>これもクリックできる</p>");
});

1.9以降で同じ挙動させるならonを使う

$(document).on('click', 'p', function() {
    $(this).after("<p>これもクリックできる</p>");
});

documentの部分を別のjQueryオブジェクトにすると、
そのオブジェクト配下だけで動的にイベントが付与される。

// hoge配下にp要素ができたときだけイベントを付与
$("#hoge").on('click', 'p', function() {
    $(this).after("<p>これもクリックできる</p>");
});

jQueryの場合のサンプル

See the Pen EOwjbB by beatdjam (@beatdjam) on CodePen.

pure JSの場合

pure JSの場合は、親要素にイベントを仕込んで、eventのtargetの属性を見ることで対応するっぽい。
対象のelementの条件がidか、classか、tagNameかによって挙動が変わって分かりづらい。
正直jQueryのほうがきれいだと思う。

document.addEventListener('click', function (e) {
    // idの場合はこう
    // if (e.target.id === 'hoge') {
    // class名指定の場合はこう
    // if (e.target.classList.contains('hoge')) {
    // タグ名指定の場合はこう(大文字で取れるのでtoLowerCaseしている)
    if (e.target.tagName.toLowerCase() === 'p') {
        e.target.insertAdjacentHTML('afterend', "<p>これもクリックできる</p>")
    } 
});

JSでもaddEventListenerするelementを絞ってやることができる。

document.querySelector("#hoge").addEventListener('click', function (e) {
    if (e.target.tagName.toLowerCase() === 'p') {
        e.target.insertAdjacentHTML('afterend', "<p>これもクリックできる</p>")
    } 
});

JavaScriptの場合のサンプル

See the Pen WYZvOd by beatdjam (@beatdjam) on CodePen.

insertAdjacentHTMLについては下記参照。便利。
innerHTML より insertAdjacentHTML を使う - Qiita

【Java/Kotlin】URI Template(RFC6570)の仕様に則ってURL文字列に変数をセットする

"http://example.com/name/{name}/age/{age}"のような文字列に対して変数を割り当てたいとき、 javax.ws.rs.core.UriBuilderが利用できる。

URI文字列がqueryも含む場合は、 UriBuilder.fromUri() を利用すると良い。

  • Javaの場合
import javax.ws.rs.core.UriBuilder;
import java.util.HashMap;
import java.util.Map;

class Demo {
    public static void main(String[] args) {
        String template = "http://example.com/name/{name}/age/{age}";

        // mapで変数に対応するkey-valueを与えると置換できる
        // UriBuilder.buildFromMap()
        Map<String, String> parameters = new HashMap<>();
        parameters.put("name","Bob");
        parameters.put("age","17");

        String bob = UriBuilder.fromPath(template)
                .buildFromMap(parameters)
                .toASCIIString();
        
        // http://example.com/name/Bob/age/17
        System.out.println(bob);
  
        // 変数の順番が固定であれば、手前から順番に置換することもできる
        // UriBuilder.build()
        String alice = UriBuilder
                .fromPath(template)
                .build("Alice","15")
                .toASCIIString();

        // http://example.com/name/Alice/age/15
        System.out.println(alice);
    }
}
  • Kotlinの場合
import javax.ws.rs.core.UriBuilder

fun main() {
    val template = "http://example.com/name/{name}/age/{age}"

    // mapで変数に対応するkey-valueを与えると置換できる
    // UriBuilder.buildFromMap()
    val parameters = mapOf(
            "name" to "Bob",
            "age" to "17"
    )

    val bob = UriBuilder.fromPath(template)
            .buildFromMap(parameters)
            .toASCIIString()

    // http://example.com/name/Bob/age/17
    println(bob)

    // 変数の順番が固定であれば、手前から順番に置換することもできる
    // UriBuilder.build()
    val alice = UriBuilder.fromPath(template)
            .build("Alice", "15")
            .toASCIIString()

    // http://example.com/name/Alice/age/15
    println(alice)
}

参考 : how to use URI templates to change path parameters in a URL in java - Stack Overflow