Blog

  • 하와이 헤븐리(heavenly) 아이슬랜드 레스토랑

    하와이 헤븐리(heavenly) 아이슬랜드 레스토랑

    하와이 와이키키 해변 근처에 있는 헤븐리 아이슬랜드 레스토랑을 다녀왔다.

    약간 가정식 레스토랑 같은 느낌이긴 한데 분위기도 좋고 매장 내부도 넓고 무엇보다 음식이 맛있다. 쌀밥으로 하는 메뉴들도 제법 있어서 밥 종류의 요리가 땡길때 추천할만한 곳이다.

    dscf5807

    메뉴


    나는 종업원한테 메뉴를 추천해달라고 했다. 3가지의 메뉴를 추천해줬는데 모두 맛있었다. 식사메뉴 뿐만 아니라 아시이볼과 같은 디저트 메뉴들도 많기 때문에 식사와 디저트 그리고 커피까지 다 해결할 수 있는 레스토랑이다. 모든 메뉴를 확인하고 싶다면 사이트에 방문해서 확인하면 된다.

    dscf5813
    Havenly’s Organic Veggie & Beans Loco Moco
    dscf5814
    Big Island Honey French Toast
    dscf5815
    Local Egg Benedict

    위치


    위치는 와이키키 해변 근처에 있어서 접근성이 아주 좋다.

  • 다이슨 (Dyson) 유선 청소기 공식 서비스센터에서 수리하다.

    다이슨 (Dyson) 유선 청소기 공식 서비스센터에서 수리하다.

    다이슨 유선 청소기 DC46모델을 수리했다. 구매한지 5년이 조금 안된 청소기인데 어느날 부터 모터 타는 냄새와 필터쪽에서 고약한 냄새가 나기 시작했다.

    그냥 아무생각 없이 참고 써왔는데 이젠 소음까지 들리기 시작해서 청소기 수리를 알아보기 시작했다. 처음에는 당연히 서비스 기간이 지났다고 생각해서 사설 서비스 업체를 알아봤는데 유선 모델은 취급 안한다는 답변을 듣고… 정식 다이슨 서비스센터에 전화를 걸었다.

    다이슨 청소기 무상기간은 5년


    상담원이 청소기 일련번호를 물어봤다. 청소기 바닥면에 적혀있는 일련번호를 불렀더니 다행히 무상기간이 아직 유효하다고 했다.

    서비스 신청 절차도 간편했다. 주소를 알려주면 다이슨 직원이 집으로 방문해서 청소기를 들고간다. 그리고 공장입고 및 점검이 끝나면 무상 서비스에 포함되지 않는 부품 교체가 필요한 경우 별도로 비용을 안내해준다. 전화로 카드결제를 진행할 수 있고 수리가 완료된 청소기는 다시 다이슨 직원이 집까지 배달해준다.

    일단 택배가 아닌 직원이 직접 방문해서 설명 해주고 수리가 완료된 청소기를 집까지 다시 가져다 준다는 점이 맘에 들었고 청소기 수리과정 및 동영상도 찍어서 공유 해준다.

    img 6838
    수리가 완료된 부품들

    img 2886
    청소기 헤드도 완전 깨끗한 상태로 클리닝되어 왔다.
    img 1067
    본체 및 필터
    img 1678
    아주 만족스럽다.
    img 5612

    교체된 부품 및 청구비용


    무상 서비스 기간이라서 모터교체 (19만원)과 포스트 필터 교체(약 6만원) 비용이 무상으로 처리되었다. 싸이클론에 있는 프리필터의 경우 소모품이라 무상처리 대상이 아니라서 4만 4천원이 청구되었고 기술자에게 지급되는 기술료 2만원이 청구되었다. 결과적으로 총 지불한 금액은 6만 4천원이다.

    img 8724
    총 청구비용 6, 4000원

    조금만 늦었으면 무상 서비스 기간을 놓칠 뻔했는데 다행히 5년을 넘기지 않아서 수리를 할 수 있어서 참 다행이었다. 그리고 기대 이상 이었던 다이슨 서비스 였다. 다시 새것처럼 돌아온 DC46 청소기 앞으로 5년 이상 잘 써야겠다.

  • Handbrake로 Adobe Media Encoder를 대체하다

    Handbrake로 Adobe Media Encoder를 대체하다

    요즘 여행 영상을 정리해서 편집하고 아이패드에 옮기는 작업을 하고 있다. 나는 맥을 사용하고 있는데 별도의 앱을 따로 설치하지 않고 애플에서 기본 제공하는 앱을 활용하는 편이다. 이번 글에서는 동영상을 아이패드로 옮기는 과정에서 인코딩 문제가 발생한 경우 그 해결 방법에 대해서 써봤다.

    아이패드에 여행 영상 옮기는 방법


    Apple TV 앱을 열고 아이패드를 연결해서 편집한 영상을 Home Video 로 추가하고 Add to Device 로 아이패드를 선택하면 쉽게 옮길 수 있다.

    apple tv 2
    Mac의 기본 어플 Apple TV
    movie edit
    영상을 홈 비디오에 추가하고 우측 하단 아이콘을 선택하면 옵션이 나온다
    add to list
    옵션에서 Add to Device 항목에서 아이패드를 선택하면 영상이 옮겨진다.

    인코딩 문제로 인해 동영상을 옮길 수 없는 경우는?


    문제는 가끔 아이패드에서 재생할 수 없는 영상이라며 에러 팝업이 표시되는 경우이다. 이런 경우 인코딩 문제일 확률이 아주 높다. 아이패드나 아이폰 디바이스에서 재생할 수 있는 형태로 동영상이 인코딩 되어있지 않은 경우 발생한다.

    어도비를 사용하는 사람이라면 Adobe Media Encoder를 이용해서 아이폰 혹은 아이패드에서 재생할 수 있도록 다시 인코딩하면 해결 될 것이다. 그런데 디자인 업무를 전문적으로 하지 않는 나같은 일반 취미 사용자들은 Adobe 소프트웨어를 매달 결제하는 것이 부담이 된다.

    그래서 이를 대체할 만한 소프트웨어를 찾다가 Hand Brake라는 오픈 소프트웨어를 발견했다. 검색해보면 유투브에도 어도비 툴이랑 비교한 내용이 상당히 많이 있다. 프랑스에서 만든 오픈 소프트웨어인 것 같다. (맥 뿐만 아니라 윈도우도 지원한다 👍)

    handbreak
    HandBreak 앱을 실행하고 영상을 선택 -> Preset에서 Apple 디바이스를 선택

    HandBreak 앱을 열고 문제있는 영상을 추가하자. 그리고 Preset에서 Apple 디바이스를 선택하고 중앙 상단에 있는 Start 버튼을 누르면 인코딩이 시작된다. 내가 찍은 영상에 따라서 1080p 해상도인지 4k 해상도인지 Preset 선택시 고를 수 있다.

    인코딩이 완료되면 앞서 설명한대로 다시 Apple TV앱을 열고 인코딩이 완료된 영상을 선택하고 아이패드로 옮겨보자. 아마 문제없이 옮길 수 있을 것이다.

    list of apple
    Apple TV앱을 통해 아이패드에 여행영상이 추가된 것을 확인할 수 있다.

    마치며


    애플이 제공하는 기본 앱들을 잘 활용하면 굳이 돈주고 동영상 플레이어나 동영상 편집기등을 구입할 필요가 없다고 생각한다.

    물론 기본 앱에서 제공하는 기능 이상으로 좀 더 전문적인 편집이 필요한 경우 파이널 컷 프로 등의 프로그램이 필요하겠지만 기본 기능도 워낙 충실한 편이라 나같이 취미로 여행사진이나 영상을 편집하는 경우에는 충분한 것 같다. 기본 사진앱, iMovie, Apple TV 앱 활용 방법에 대해서 앞으로도 계속 포스팅 할 예정이다.

  • 싱가포르 슬링의 원조, 래플스 호텔(RAFFLES Hotel) 롱바

    싱가포르 슬링의 원조, 래플스 호텔(RAFFLES Hotel) 롱바

    싱가포르 슬링이 처음 제조된 곳, 래플스 호텔의 롱바를 찾았다. 저녁을 먹고 들린 곳인데 밤 10시가 넘었는데도 많은 사람들이 롱바 입장을 기다리고 있었다.

    싱가포르 슬링에 대해서 간단히 역사(?)를 소개하자면 Ngiam Tong Boon라는 롱바에서 일하던 바텐더가 1915년에 롱 드링크라는 이름의 칵테일을 제조하였고 이후 1930년 Savoy Cocktail Book 에 처음으로 싱가포르 슬링이라는 이름으로 레시피가 기록되어 있었다고 한다. 그 내용은 레몬주스 1/4, 드라이 진 1/4, 체리 브랜디 1/2를 잘 흔들어서 유리잔에 걸러내고 소다수를 채우고 얼음 1 덩어리를 추가하는 것이라고 기록되어 있었다. (내용 출처는 위키피디아)

    싱가포르 슬링은 1982년도에 Sainsbury Book of Cocktails & Party Drinks라는 책에서 다시 한번 소개되면서 유명해졌다고 한다. (무언가 기록을 남기는 것이 중요한 것 같다.)

    롱바


    dscf0155
    롱바의 입구, 싱가포르 슬링과 칵테일의 역사가 곳곳에 설명되어 있다
    dscf0159
    롱바에 널려있는 건 바로 이 땅콩이다. 바닥에 수북히 쌓여있고 칵테일 안주로 무한정 제공된다.
    dscf0161
    천장을 올려다보니 커다란 부채가 설치되어 있었다. 오래된 공간에 온 느낌을 전달해주는 인테리어다.

    칵테일


    dscf0163
    싱가포르 슬링의 원조인 롱 드링크(이름이 정확히 기억은 안난다)와 뒤에 보이는 파인애플 있는 잔이 싱가포르 슬링이다.
    dscf0164
    싱가포르 슬링, 칵테일 잔도 다른 칵테일과는 다른 유리 잔에 부어준다.

    현대화 된 싱가포르 도심속에서 약 100년 전에도 있었던 공간에 오니 느낌이 참 다르다. 술을 잘 마시지는 못하지만 싱가포르 슬링은 알콜이 강하게 느껴지지 않아서 부드럽게 넘길 수 있는 술이었다. 좋은 공간이었고 다시 오고 싶은 곳이었다.

    위치


    지도에 보는 것과 같이 래플스 호텔은 도심 한복판에 있어서 찾아가기가 쉽다. 짧은 여행일정이라 그랩으로 이동 하였는 데 일정이 길지 않다면 대중교통보다는 그랩(Grab)을 이용하는 것도 시간을 절약할 수 있는 좋은 방법인 것 같다.

  • 싱가포르 리틀 인디아, 아기자기한 상점들과 셀피 커피 그리고 맛집 FIKA가 있는 곳

    싱가포르 리틀 인디아, 아기자기한 상점들과 셀피 커피 그리고 맛집 FIKA가 있는 곳

    오늘은 싱가포르 리틀 인디아를 다녀왔습니다. 택시를 타고 오전 11시쯤 리틀 인디아의 상점들이 몰려있는 골목에서 내려서 구경하기 시작했습니다.

    리틀 인디아의 시작점, 골목


    dscf0206
    1차선 도로의 좁은 공간 양쪽으로 카페, 햄버거, 기념품 상점들이 있어서 재미있었던 골목 (Haji LN)
    dscf0204
    리틀 인디아의 핫 플레이스 셀피 커피
    dscf0211
    라떼 아트

    셀피 커피는 핸드폰에 저장된 사진을 라떼 아트로 출력해주는 곳입니다. 일반적인 라떼 아트(커피 위에 거품을 이용해서 모양을 만들어주는 것)도 해주고 푸드 프린팅을 이용해서 컬러로 라떼 아트를 해줍니다.

    골목 밖의 풍경


    Haji LN 골목을 빠져나와서 우측으로 이동하면 술탄 모스크와 로컬 인도 음식 점 등이 보입니다. 이날 날씨가 엄청 좋았는데 사진 속 하늘에 잘 표현된 것 같습니다.

    dscf0222
    리틀 인디아는 아기자기한 상점들과 기념품 가게가 많고 사진 찍기 좋은 스팟이 많습니다.
    dscf0225
    술탄 모스크

    리틀 인디아 속 스웨덴 식 음식점 FIKA


    리틀 인디아에는 인도 음식점이 많은데 약간 레스토랑 같이 깔끔한 곳을 찾기가 좀 어려웠습니다. 그래서 Trip Advisor 어플을 켜고 주변 검색을 했는 데 마침 스웨덴 식 레스토랑이 근처에 있어서 방문했는데 너무 맛있었어요.

    dscf0228

    음식 주문을 해야되는 데 처음 방문이다보니 종업원에게 추천해달라고 했습니다. 음료와 브리또 그리고 해산물 파스타를 추천해주셔서 고민없이 OK 했습니다. 결과적으로 다 너무 맛있었고 리틀 인디아에 다시 방문하게 된다면 한 번 더 방문하고 싶은 레스토랑 입니다.

    dscf0229
    음료 이름이 정확히 기억은 안나는데 강추입니다.
    dscf0237
    브리또와 샐러드
    dscf0239
    해산물 파스타
    dscf0227
    다음에 리틀 인디아를 가게되면 방문해보고 싶은 machi machi

    싱가포르에서의 마지막 식사였습니다. 계산을 기다리며 건너편 풍경을 보니 machi machi라는 디저트 가게에 사람들이 끊이지 않고 방문하는게 보였습니다. 저도 들려보고 싶었지만 출국 시간이 얼마 남지 않아서 패스했는데 사진을 보니 뭔가 그때의 아쉬움이 남아있네요. 나중에 검색해보니 버블티로 유명한 곳이었고 저는 인천공항 도착해서 공차에 들려서 버블티로 아쉬움을 달랬습니다.

    리틀 인디아의 위치는?


    11 Haji Lane 골목부터 관광을 시작하면 좋을 것 같아요. 리틀 인디아의 시작점인 골목길 입니다.

  • Xcode Shortcut Keys to Boost iOS Development Productivity

    Xcode Shortcut Keys to Boost iOS Development Productivity

    In this post, I’ll introduce useful shortcut keys to boost your productivity.

    I know it’s hard to remember shortcut keys, but when you try to use it every day, then you will be used to using them.

     

    Hide or show the navigator

    xcode_left.gif

     

    Hide or show the inspectors

    xcode_right.gif

     

    Hide or show the debug area

    xcode_bottom.gif

     

    I will be adding shortcut keys more.

  • 싱가포르 마리나베이 샌즈 리조트

    싱가포르 마리나베이 샌즈 리조트

    싱가포르의 상징과도 같은 건물, 마리나베이 샌즈 리조트를 다녀왔습니다. 다행히 올해 코로나가 터지기 직전인 1월에 싱가포르를 다녀왔는데 사진을 보니 또 가고 싶네요. 코로나가 빨리 끝났으면…

    dscf0141
    유람선을 타고 바라본 호텔 풍경

    마리아베이 샌즈 리조트


    dscf0241
    드디어 마리나베이 샌즈 체크인하러 가는 길
    dscf0250
    결혼 기념일이라고 예약할 때 말했는데 간단한 축하 메세지를 준비해주셨네요
    dscf0282
    기념일 케익도 굿
    dscf0249
    호텔 구석구석 구경

    방에서 바라본 뷰


    저희가 머무른 방은 가든 뷰입니다. 가든스바이더베이가 한눈에 내려다보이는 데 너무 좋았어요. 저 멀리 바다도 보이고 특히 밤에는 영화 아바타 풍경을 바라보는 기분이 들었습니다.

    dscf0244
    dscf0245
    dscf0248
    dscf0337
    dscf0338
    dscf0339
    dscf0342
    dscf0345
    dscf0347

    수영장


    인피니티 풀로 유명한 옥상 수영장입니다. 호텔에 투숙하지 않더라도 입장료를 구매하면 수영장이 있는 옥상까지는 입장이 가능했던 것 같아요. (전망 관람만 할 수 있는 곳만 입장 가능)

    호텔 투숙객들은 수영장, 사우나 및 헬스장 같은 부대시설을 이용할 수 있고 썬베드도 생각보다 넉넉해서 자리가 부족하다는 느낌은 없었습니다.

    사진으로 수영장 풍경을 많이 보긴 했지만 역시 직접 가서 느껴보니 훨씬 더 좋았습니다. 저녁에도 수영장 입장할 수 있는 데 야경 정말 멋졌습니다. 사진도 많이 찍었는 데 밤이라 다 흔들려서 건진게 없네요. 😅

    dscf0275
    dscf0276

    조식 뷔페


    호텔 규모가 워낙 크다보니 조식 뷔페 장소도 3군데 이상입니다. 수영장에 위치한 곳에서 조식을 먹을수도 있고 1층 로비 근처에서 먹을 수도 있습니다. 원하시는 곳을 선택하시면 되는 데 저는 1층 로비 근처에 있는 조식뷔페를 선택했어요.

    음식은 정말 다양하게 있는 데 아래 사진들은 제가 먹었던 메뉴들 입니다.

    dscf0348
    dscf0349
    dscf0351

    위치


    호텔 위치는 지도를 참고해주세요. 😀

  • 싱가포르 센토사 스카이라인 루지

    싱가포르 센토사 스카이라인 루지

    싱가포르 센토사 섬에 있는 스카이 라인 루지를 소개합니다.

    스카이 라인 루지가 회사 이름인데 사이트를 방문해보니 통영에도 있네요 😀

    루지는 카트를 타고 언덕을 내려오는 액티비티인데 탑승 전에 헬멧 및 안전요원의 가이드를 받고 진행하기 때문에 온 가족이 안전하게 즐길 수 있는 액티비티라고 생각합니다.

    개인적으로 너무 재미있었어서 싱가포르 여행 계획 중이시라면 꼭 체험해보시길 추천합니다.

    스카이 라인 루지


    dscf0066
    기본 요금은 인당 24달러 (라이딩 2회 가능)
    dscf0068
    리프트에 카트를 걸치고 쭈욱 올라갑니다.
    dscf0069
    탑승 전 간단한 카트 조작법 (방향전환, 브레이크)을 배우고 출발
    gx010036
    영상 대신 gif 를 준비했습니다. 로딩 조금만 기다려주세요~

    위치


    모노레일을 타고 Imbiah Station 역에서 내리면 바로 루지 탑승하는 장소가 보이실 겁니다. 공식 사이트에서 안내하는 오시는 길도 참고해보세요.

  • 온타리오 알곤퀸(Algonquin) 공원

    온타리오 알곤퀸(Algonquin) 공원

    토론토 출장을 갔었는데 마침 9월달 가을이었습니다. 주말에 근교 여행을 알아보던 중 온타리오 주의 알곤퀸 공원이 단풍으로 아주 유명하다는 소식을 듣고 검색을 시작했죠.

    알곤퀸 공원 홈페이지를 접속했는데 현재 단풍 상황을 업데이트하고 있었고 메인화면에 “지금이 단풍 구경하러 오기 가장 좋은 시기”라는 문구를 보자마자 바로 차타고 토론토에서 출발했습니다.

    알곤퀸 공원 가는 길


    캐나다에는 단풍 나무가 정말 많아서 공원 가는 길에도 단풍을 구경할 수 있었습니다. 그러나 알곤퀸 공원에서 단풍 감상하는 것과는 비교가 안될 정도로 직접 가서 보는 것이 훨씬 좋았습니다. 알곤퀸 공원에는 정말 빽빽하게 단풍나무가 심어져 있고 호수와 함께 바라보는 단풍이 최고였습니다.

    단, 토론토에서 알곤퀸 공원까지 편도로 약 4시간 정도 운전했던 것 같네요.

    sam 0131
    토론토에서 알곤퀸 공원 가는 중

    알곤퀸 공원 도착


    4시간 가량의 운전 끝에 드디어 알곤퀸 공원 도착했습니다. 참고로 공원 근처에서는 핸드폰이 아에 안터집니다. 운전하고 가다가 갑자기 핸드폰 신호가 끊겨서 당황스러웠어요.

    알곤퀸 공원에는 표지판 곳곳에 곰을 조심하라는 안내가 있어서 조금 주변을 경계하게 되더라고요.

    sam 0136
    알곤퀸 공원 도착
    sam 0151
    단풍이 보이기 시작
    sam 0162
    알곤퀸 공원
    sam 0183
    sam 0184
    공원 관리자가 한국어 설명을 고쳐줄 수 있냐고 부탁해서 조금 수정해드렸다
    sam 0188
    카메라에 담지 못한 풍경
    sam 0202
    잠시 주차하고 단풍 감상
    sam 0267
    단풍이 너무 아름다웠다
    sam 0267 1
    sam 0341
    단풍국의 가을 풍경

    위치


    알곤퀸 공원 방문하시기 전에 공원 홈페이지에 방문하셔서 언제 방문하면 좋은지 미리 체크하고 가시는 것을 추천드립니다. 가을에 가면 정말 좋을 것 같지만 여름이나 봄에 가도 공원 자체가 워낙 크기 때문에 좋을 것 같네요.

  • How to get the date you want using the Calendar

    How to get the date you want using the Calendar

    In this post, I’ll write about Calendar to get the date you want.

    You can get the specific time and dates like midnight, noon, tomorrow, the start of this week, and more!

     

    WeekDay

    You can get a weekday from Calendar. I’ll use it to get the startOfThisWeek and beforeStartOfBiWeek.

    enum CalendarWeekDay: Int {
        case sun = 1
        case mon
        case tue
        case wed
        case thu
        case fri
        case sat
    }
    
    extension CalendarWeekDay {
        func startOfWeek(_ weekDay: CalendarWeekDay = .sun) -> Int? {
            guard weekDay == .sun || weekDay == .mon else {
                return nil
            }
            if weekDay == .sun {
                return (self.rawValue - 1) * -1
            }
            else {
                switch self {
                case .sun:
                    return -6
                default:
                    return (self.rawValue - 2) * -1
                }
            }
        }
    
        var beforeStartOfBiWeek: Int {
            startOfWeek(.sun)! - 7
        }
    }
    

     

    Date

    I set the start of the day to midnight(AM 00:00:00) and the end of the day to military time(PM 23:59:59).

    extension Date {
        var startOfDay: Date {
            return Calendar.current.date(
            byAdding: .day, 
            value: 0, 
            to: midNight)!
        }
    
        var yesterday: Date {
            return Calendar.current.date(
            byAdding: .day, 
            value: -1, 
            to: midNight)!
        }
    
        var tomorrow: Date {
            return Calendar.current.date(
            byAdding: .day, 
            value: 1, 
            to: midNight)!
        }
    
        var dayAfterTomorrow: Date {
            return Calendar.current.date(
            byAdding: .day, 
            value: 2, to: midNight)!
        }
    
        var midNight: Date {
            Calendar.current.date(
            bySettingHour: 00, 
            minute: 0, 
            second: 0, 
            of: self)!
        }
    
        var militaryTime: Date {
            Calendar.current.date(
            bySettingHour: 23, 
            minute: 59, 
            second: 59, of: self)!
        }
    
        var noon: Date {
            Calendar.current.date(
            bySettingHour: 12, 
            minute: 0, 
            second: 0, 
            of: self)!
        }
    
        var month: Int {
            Calendar.current.component(.month,  from: self)
        }
    
        var isLastDayOfMonth: Bool {
            tomorrow.month != month
        }
    
        var startOfThisWeek: Date {
            let weekDay = CalendarWeekDay(
                rawValue: Calendar.current.component(.weekday, from: self)
            )!
            return Calendar.current.date(
                byAdding: .day,
                value: weekDay.startOfWeek(.sun)!,
                to: startOfDay)!
        }
    
        var beforeStartOfBiWeek: Date {
            let weekDay = CalendarWeekDay(
                rawValue: Calendar.current.component(
                .weekday, 
                from: self)
            )!
            return Calendar.current.date(
            byAdding: .day, 
            value: weekDay.beforeStartOfBiWeek, 
            to: startOfDay)!
        }
    
        var startOfMonth: Date {
            return Calendar.current.date(
                from: Calendar.current.dateComponents(
                    [.year, .month],
                    from: Calendar.current.startOfDay(for: self)
                ))!
        }
    
        var endOfMonth: Date {
            return Calendar.current.date(
                byAdding: DateComponents(month: 1, day: -1),
                to: startOfMonth.militaryTime
            )!
        }
    }
    

    All done! Let’s make a test code.

    The default timeZone is UTC. I recommend setting your timeZone before checking test results.

    import XCTest
    @testable import CalendarSample
    
    fileprivate var dateformatter: DateFormatter {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy.MM.dd ahh:mm"
        formatter.locale = Locale(identifier: "en_KR")
        formatter.calendar = Calendar.current
        return formatter
    }
    class CalendarTests: XCTestCase {
        func test_start_of_week_and_biweek() {
            let sunday = dateformatter.date(from: "2020.07.12 AM00:00")!
            let monday = dateformatter.date(from: "2020.07.13 AM00:00")!
            let tuesday = dateformatter.date(from: "2020.07.14 AM00:00")!
            let wednesday = dateformatter.date(from: "2020.07.15 AM00:00")!
            let thursday = dateformatter.date(from: "2020.07.16 AM00:00")!
            let friday = dateformatter.date(from: "2020.07.17 AM00:00")!
            let saturday = dateformatter.date(from: "2020.07.18 AM00:00")!
    
            XCTAssertEqual(sunday.startOfThisWeek.KST, "2020.07.12 AM12:00")
            XCTAssertEqual(sunday.beforeStartOfBiWeek.KST, "2020.07.05 AM12:00")
    
            XCTAssertEqual(monday.startOfThisWeek.KST, "2020.07.12 AM12:00")
            XCTAssertEqual(monday.beforeStartOfBiWeek.KST, "2020.07.05 AM12:00")
    
            XCTAssertEqual(tuesday.startOfThisWeek.KST, "2020.07.12 AM12:00")
            XCTAssertEqual(tuesday.beforeStartOfBiWeek.KST, "2020.07.05 AM12:00")
    
            XCTAssertEqual(wednesday.startOfThisWeek.KST, "2020.07.12 AM12:00")
            XCTAssertEqual(wednesday.beforeStartOfBiWeek.KST, "2020.07.05 AM12:00")
    
            XCTAssertEqual(thursday.startOfThisWeek.KST, "2020.07.12 AM12:00")
            XCTAssertEqual(thursday.beforeStartOfBiWeek.KST, "2020.07.05 AM12:00")
    
            XCTAssertEqual(friday.startOfThisWeek.KST, "2020.07.12 AM12:00")
            XCTAssertEqual(friday.beforeStartOfBiWeek.KST, "2020.07.05 AM12:00")
    
            XCTAssertEqual(saturday.startOfThisWeek.KST, "2020.07.12 AM12:00")
            XCTAssertEqual(saturday.beforeStartOfBiWeek.KST, "2020.07.05 AM12:00")
        }
    
        func test_get_specific_from_date() {
            let sunday = dateformatter.date(from: "2020.07.12 AM00:00")!
    
            XCTAssertEqual(sunday.midNight.KST, "2020.07.12 AM12:00")
            XCTAssertEqual(sunday.noon.KST, "2020.07.12 PM12:00")
            XCTAssertEqual(sunday.militaryTime.KST, "2020.07.12 PM11:59")
    
            XCTAssertEqual(sunday.yesterday.KST, "2020.07.11 AM12:00")
            XCTAssertEqual(sunday.tomorrow.KST, "2020.07.13 AM12:00")
            XCTAssertEqual(sunday.dayAfterTomorrow.KST, "2020.07.14 AM12:00")
        }
    
        func test_check_month_from_date() {
            let sunday = dateformatter.date(from: "2020.07.12 AM00:00")!
            let lastDayOnJuly = dateformatter.date(from: "2020.07.31 AM00:00")!
    
            XCTAssertEqual(sunday.startOfMonth.KST, "2020.07.01 AM12:00")
            XCTAssertEqual(sunday.endOfMonth.KST, "2020.07.31 PM11:59")
    
            XCTAssertEqual(sunday.isLastDayOfMonth, false)
            XCTAssertEqual(lastDayOnJuly.isLastDayOfMonth, true)
        }
    }
    
    fileprivate extension Date {
        //Set your timeZone
        var KST: String {
            dateformatter.timeZone = TimeZone(abbreviation: "KST")
            return dateformatter.string(from: self)
        }
    }
    

    test1.png

    Done! 😎

    Done! 😎

     

    Thanks for reading my post. Next time I’ll write about CoreData. If you have any questions, please leave a comment here.