👩💻 全域工具包 TimeZone
關於全域工具包 TimeZone
為甚麼要特地提供一個 UUID 服務呢?
- 為了做測試隔離
- 會有好幾個模組需要使用到這個功能
- 在雲端服務中,直接取 local time 會取到伺服器當地的時間,造成時間不準確的問題
製作全域工具包 TimeZone
- 先建立一個 clock 的資料夾
src
└─user
│
└─uuid
│
└─clock
│
└─app.controller.spec.ts
│
└─app.controller.ts
│
└─app.module.ts
│
└─app.service.ts
│
└─main.ts
建立 interface
- 在 uuid 資料夾底下,建立一個 clock.service.interface.ts
clock
└─clock.service.interface.ts
export interface ClockServiceInterface{
/**
* 取得 +8 時間
*/
getTime():string;
}
建立 service
- 此處可以使用 nest cli 來建立一個 service
nest generate service clock
clock
└─clock.service.interface.ts
|
└─clock.service.ts
|
└─clock.service.spec.ts
clock.service.spec.ts 是在進行測試使用的
import { Injectable } from '@nestjs/common';
import { ClockServiceInterface } from './clock.service.interface';
@Injectable()
export class ClockService implements ClockServiceInterface {
/**
* 取得標準時間
* @returns
*/
private getTimeZone(): Date {
const utcTime =
new Date().getTime() + new Date().getTimezoneOffset() * 60 * 1000;
return new Date(utcTime);
}
/**
* 取得 +8 時間
*/
getTime(): string {
const offset = 8 * 60; // 8小時的分鐘數
const utcTime = this.getTimeZone().getTime(); // 使用 getTimeZone() 取得標準時間
const localTime = new Date(utcTime + offset * 60 * 1000);
return localTime.toISOString();
}
}
註冊模組
- 先使用 nest cli 建立一個 clock.module.ts
nest generate module clock
clock
└─clock.service.interface.ts
|
└─clock.service.ts
|
└─clock.module.ts
|
└─clock.service.spec.ts
- 註冊 clock 服務
- 並且需要做 exports 來上匯出模組
- 使用
@Global()
來表示他是全域的模組
import { Global, Module } from '@nestjs/common';
import { ClockService } from './clock.service';
@Global()
@Module({
providers: [
{
provide: 'ClockServiceInterface',
useClass: ClockService,
},
],
exports: [
{
provide: 'ClockServiceInterface',
useClass: ClockService,
},
],
})
export class ClockModule {}
- 到 app.module.ts 底下註冊 UuidModule
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './user/user.module';
import { UuidModule } from './uuid/uuid.module';
import { ClockModule } from './clock/clock.module';
@Module({
imports: [UserModule, UuidModule, ClockModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
注意事項
警告
如果直接將 Date
物件,透過 controller 帶給客戶端,那麼客戶端拿到的會是格林威治時間
,
所以必須將時間轉換成ISO string
或是time stamp